每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。

放弃不难,但坚持很酷~

一、logback日志框架

logback 是一个开源的日志组件,由三个部分组成:logback-core,logback-classic,logback-access。其中 logback-core 是其他两个模块的基础。

在 spring boot 中,由于 spring-boot-starter-web 和 spring-boot-starter-logging 是有依赖关系的,所以只需要引入 spring-boot-starter-web 就可以使用 logback 框架了。

logback 中有几个常用标签:

property、appender,encoder、filter、rollingPolicy、logger、root 等,下文会有详细介绍。

spring boot 会默认加载 logback-spring.xml 文件,如果自定义配置名称(logback-test.xml)的话,可在 application.xml 文件内添加:

logging:config: classpath:logback-test.xml

先来看一下配置大概:

<?xml version="1.0" encoding="UTF-8"?>

...

configuration 标签有三个属性:

  • scan:当此属性设置为 true 时,spring boot 会每隔一段时间扫描一次该文件,默认是 true 。

  • scanperiod:设置扫描间隔时间,如果没有设置时间单位,默认为毫秒。当 scan 为 true 时,此属性生效。默认的时间间隔为 1 分钟。

  • debug:当此属性设置为 true 时,将打印 logback 的内部日志,实时查看 logback 运行状态。默认值为 false 。

二、自定义logback-spring.xml文件

2.1、日志输出到控制台:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%nUTF-8appender>

表示对日志输出进行编码:

  • %d{HH: mm:ss.SSS}:日志输出时间

  • %thread:输出日志的进程名字,这在 Web 应用以及异步任务处理中很有用。

  • %-5level:日志级别,并且使用5个字符靠左对齐

  • %logger{36}:日志输出的类名

  • %msg:日志消息

  • %n:换行符

2.2、日志输出到文件

按日志级别输出到文件,将 error 级别的日志与其它级别的日志进行分离:



<appender name="FILE-INFO-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">

<append>trueappend>${LOG_PATH}/info/${LOG_INFO_FILE}}ERRORDENYismatch>ACCEPTismatch>${LOG_PATH}/info/info.%d{yyyy-MM-dd}.%i.log.gz10MB20GBistory>60istory>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%nUTF-8appender>

<appender name="FILE-ERROR-ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">

<append>trueappend>${LOG_PATH}/error/${LOG_ERROR_FILE}ERROR${LOG_PATH}/error/error.%d{yyyy-MM-dd}.%i.log.gz10MB20GBistory>60istory>

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%nUTF-8appender>

关于日志输出到文件的配置代码有很多,本文尽量详细地一一说明:

  • property:用来定义变量值的标签。property 标签有两个属性,name 和 value ,其中 name 的值是变量的名称,value 的值是变量定义的值。定义变量后,可以使 “${name}” 来使用变量。

  • appender:有两个属性 name 和 class,name 指定 appender 名称,class 指定 appender 的全限定名。

  • append:如果是 true ,日志被追加到文件结尾,如果是 false,清空现存文件,默认是 true 。

  • filter:可以为 appender 添加一个或多个过滤器,可以用任意条件对日志进行过滤。执行一个过滤器会有返回 DENY,NEUTRAL,ACCEPT 其中之一。

    • DENY:日志将立即被抛弃不再经过其他过滤器。

    • NEUTRAL:有序列表里的下个过滤器过接着处理日志。

    • ACCEPT:日志会被立即处理,不再经过剩余过滤器。

      appender 有多个过滤器时,按照配置顺序执行。过滤器种类分为:

    • LevelFilter:级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据 onMath 和 onMismatch 接收或拒绝日志。有以下子标签:

      • :设置过滤级别。

      • :用于配置符合日志级别的操作。

      • ismatch>:用于配置不符合日志级别的操作。

    • ThresholdFilter:临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回 NEUTRAL 。当日志级别低于临界值时,日志会被拒绝。

  • rollingPolicy:描述滚动策略,这个只有 appender 的 class 是 RollingFileAppender 时才需要配置。滚动策略有很多,本文使用的是 SizeAndTimeBasedRollingPolicy ,是基于时间和文件大小的滚动策略。

    • fileNamePattern:滚动文件的名称。

    • maxFileSize:单个文件最大容量,到达这一阈值,就会生成滚动文件。

    • totalSizeCap:日志所有文件的总大小,如果总大小大于该阈值,它将删除旧文件。

    • maxHistory:按照 fileNamePattern 设置的最小单位来设定,示例配置代码的最小单位是 天 ,则该配置就是保留多少天的历史日志。

2.3、自定义包/类的日志级别

<appender-ref ref="CONSOLE"/><appender-ref ref="FILE-INFO-ROLLING"/><appender-ref ref="FILE-ERROR-ROLLING"/>

上述配置表示:com.study.spring.helloDemo 这个类中的 warn 级别日志将会使用 CONSOLE、FILE-INFO-ROLLING、FILE-ERROR-ROLLING 来打印。logger 有三个属性和一个子标签:

  • name:用来指定受此 logger 约束的某一个包或者具体的某一个类。

  • level:用来设置打印级别(TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF)。

  • addtivity:用来描述是否向上级 logger 传递打印信息。默认是 true 。

  • appender-ref:指定具体 appender。

2.4、项目所有日志输出设置

<appender-ref ref="CONSOLE"/><appender-ref ref="FILE-INFO-ROLLING"/><appender-ref ref="FILE-ERROR-ROLLING"/>

上述配置指定项目所有日志输出级别,也是一种 logger ,且只有一个 level 属性。appender-ref 标签用来指定具体的 appender 。

三、main 方法加载日志配置

spring-logback.xml 文件是 spring boot 启动项目时进行加载的。但如果单单执行一个 main 方法,由于没有加载 spring-logback.xml 文件,所以日志不会被加载到文件中,只会输出在控制台。所以首先需要使用代码实现配置文件的加载。完整代码如下:

import ch.qos.logback.classic.LoggerContext;import ch.qos.logback.classic.joran.JoranConfigurator;import ch.qos.logback.core.joran.spi.JoranException;import ch.qos.logback.core.util.StatusPrinter;import org.slf4j.LoggerFactory;

import java.io.File;import java.io.IOException;

/*** @description: 加载配置文件*/public class LogBackConfigLoader {

public static void load (String externalConfigFileLocation) throws IOException, JoranException {LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory;

File externalConfigFile = new File(externalConfigFileLocation);if(!externalConfigFile.exists){throw new IOException("Logback External Config File Parameter does not reference a file that exists");}else{if(!externalConfigFile.isFile){throw new IOException("Logback External Config File Parameter exists, but does not reference a file");}else{if(!externalConfigFile.canRead){throw new IOException("Logback External Config File exists and is a file, but cannot be read.");}else{JoranConfigurator configurator = new JoranConfigurator;configurator.setContext(lc);lc.reset;configurator.doConfigure(externalConfigFileLocation);StatusPrinter.printInCaseOfErrorsOrWarnings(lc);}}}}}

我们新建一个类,创建一个 main 方法,在 main 方法中添加 spring-logback.xml 文件的加载代码:

LogBackConfigLoader.load(Objects.requireNon(LogbackTest.class.getClassLoader.getResource("logback-spring.xml")).getPath);

结合 slf4j ,可将日志根据 logback-spring.xml 文件的配置进行输出。

四、junit 测试类加载日志配置

测试类,我试着默认情况下也是不加载日志配置的,有两种方法可以解决:

  • 使用 main 方法那种方式来加载日志配置。

  • 使用 spring boot 的注解也可以解决。

先说第一种:使用 main 方法那种方式来加载日志配置。

优点:运行测试类,执行速度快。

缺点:配置较第二种方式较复杂,代码量多。

import ch.qos.logback.core.joran.spi.JoranException;import org.junit.Test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;

import java.io.IOException;import java.util.Objects;

/*** @description: 测试类加载日志配置测试*/public class LogbackTest {

private static final Logger logger = LoggerFactory.getLogger(LogbackTest.class);

@Testpublic void test{try {LogBackConfigLoader.load(Objects.requireNon(LogbackTest.class.getClassLoader.getResource("logback-spring.xml")).getPath);} catch (IOException | JoranException e) {e.printStackTrace;}logger.info("info123");logger.warn("warn");logger.debug("debug");logger.error("error");}}

再说第二种方式:使用 spring boot 注解

优点:配置简单,俩注解完事,代码量少。

缺点:运行测试类,要先类似于启动一遍 spring boot,执行速度慢。

import org.junit.Test;import org.junit.runner.RunWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;

/*** @description: 测试类加载日志配置测试*/@RunWith(SpringRunner.class)@SpringBootTestpublic class LogbackTest {

private static final Logger logger = LoggerFactory.getLogger(LogbackTest.class);

@Testpublic void test{logger.info("info123");logger.warn("warn");logger.debug("debug");logger.error("error");}}

五、总结

logback 作为 spring boot 首选日志框架,其功能十分强大。logback 的配置应该与项目使用场景相挂钩,本文展示的配置只能满足一些通用的需求,权当 logback 的入门教程。如果后续有了新的需求,再进行补充。

本文全部代码已上传至 github :

https://github.com/841809077/spring-boot-study/blob/master/src/main/resources/logback-spring.xml

参考资料:

  • http://tengj.top/2017/04/05/springboot7/

  • https://juejin.im/post/5b51f85c5188251af91a7525

  • https://blog.csdn.net/wohaqiyi/article/details/72853962

  • https://www.mkyong.com/logging/logback-xml-example/

logback property 默认值_看完这篇文章还不会给spring boot配置logback,请你吃瓜相关推荐

  1. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  2. python 只循环目录_看完这篇文章,你的Python基础就差不多了

    世界那么大,谢谢你来看我!!关注我你就是个网络.电脑.手机小达人 前言 本文是基于黑马程序员2019年的Python基础班的内容编写的,以2019年的资料为蓝本,2018年的资料为补充,还参考了一些网 ...

  3. 苹果地图副总裁_看完这篇文章 或许你会再给“苹果地图”一次机会

    地图 4 岁了. 苹果负责互联网服务和软件的高管 Eddy Cue 和 Craig Federighi,受访畅谈地图业务"得失"的机会并不多.采访实录还没看完,我抓起 iPhone ...

  4. controller requestparam不传参数空指针异常_看完这篇文章,让你轻松学会Java异常处理...

    一.背景 最近专门负责团队的项目质量.我在治理异常日志过程中,总结了一下Java的异常处理.上面是我整理的最近自己比较常见的异常知识地图. 二.异常知识地图概述 从异常知识地图最左边的根开始看,地图从 ...

  5. python基础教程多少页_看完这篇文章,你的Python基础就差不多了(附200页《Python400集》)...

    说干就干.经过将一个多月的素材整理.编写.打磨,在上周末终于完成了. 写完它的时候,我很兴奋,因为它将是第一本系统介绍 Python技巧使用的中文教程. 它不仅适用于一个刚入坑 Python ,还未接 ...

  6. python发红包最佳手气王_看完这篇文章 以后微信抢红包手气王就是我了

    春节是中华民族隆重的农历新年,这是世界上规模最大的节日. 在春节前后,炎黄子孙们不远万里衣锦还乡,与亲人们团圆. 在此期间,中国的铁路上会发生,地球上最大规模的人口迁徙. 作为世界上最能吃最能玩的种族 ...

  7. 线性插值与矢量线性插值动画_看完这篇文章,不要再说不懂动画了

    动画是WebGL的心脏.正是因为有了动画,一个静态的WebGL场景才会变成栩栩如生的真实体验,让场景更加生动形象.WebGL并没有太多预置制作动画的方法,然而Three.js拥有一些非常专业的动画库弥 ...

  8. american主板网卡灯关机后还亮_看完这篇文章,90%的电脑黑屏问题都可以解决了!...

    经常有朋友电脑一开机,发现电脑黑屏没法用了.这是什么情况?该怎么处理?很多人看到黑屏就懵了,以为电脑要报废了,别方,下面蝈蝈来给大家讲讲常见的黑屏问题的解决办法,希望对您有所帮助! 一般常说的黑屏故障 ...

  9. 看完这篇文章还能不懂Flask这种Web框架吗?

    2019独角兽企业重金招聘Python工程师标准>>> Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeu ...

最新文章

  1. 英伟达Q4净利同比降49%,还能继续躺赚吗?
  2. 判断二叉树是否为平衡二叉树
  3. 关于error:Cannot assign to 'self' outside of a method in the init family
  4. 使用DirectX截屏
  5. sqlserver 中统计信息语句
  6. harbor pull 失败
  7. 计算机专业英语卷子,计算机专业英语A试卷.doc
  8. 如何使用Webpack在HTML,CSS和JavaScript之间共享变量
  9. Asp.Net 4.0 SEO增强之UrlRouting
  10. _mount_vendor
  11. ORACLE 11g r2   RAC 安装实施规划
  12. AOJ2025 Eight Princes
  13. JS学习总结(12)——Math对象/时间对象
  14. python中kwlist是什么意思_Python keyword.kwlist方法代碼示例
  15. 2016十月新番简介
  16. <Zhuuu_ZZ>让我们来康康脚本流程控制
  17. 【读论文】基于深度学习的铁路道岔转辙机故障诊断(2INTRO)
  18. 宜家IKEA EDIFACT PRODAT报文详解
  19. 免费SVN代码托管,不限私有,不限成员
  20. 医药数字化的中国实践

热门文章

  1. vue-router基本使用
  2. [转载] 理解RESTful架构
  3. 线程池ThreadPool知识碎片和使用经验速记
  4. Win7 命令行下C语言学习环境搭建(三)
  5. mac下使用git的冲突的解决方案
  6. MySql wait_timeout问题解决办法。
  7. ssh暴力破解解决方案
  8. vs2010打不开vs2017的.sln文件,出现错误提示 “选择的文件是解决方案文件 但是用此应用程序的较新版本创建的,无法打开”
  9. 如何使用DrawerLayout在操作栏/工具栏上方和状态栏下方显示?
  10. 打印JavaScript对象的内容? [重复]