阅读官方文档,明确Spring Boot采用的日志系统形式与共存关系,Spring Boot日志的高级配置,Spring Boot日志文件系统的依赖关系,日志接口与日志实现对Spring Boot日志输出的影响简谈,lombok与Spring Boot的结合使用
一、Spring Boot采用日志系统形式与共存关系
Spring Boot uses Commons Logging for all internal logging but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging, Log4J2, and Logback. In each case, loggers are pre-configured to use console output with optional file output also available.
By default, if you use the “Starters”, Logback is used for logging. Appropriate Logback routing is also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J, or SLF4J all work correctly.
上诉内容讲述了四个方面
第一:Spring Boot默认采用Commons Logging作为日志接口
第二:Spring Boot默认配置提供Java Util Logging, Log4J2, 和Logback
第三:如果你使用了”Starters”,那么Logback会作为默认的日志实现
第四:Spring Boot中,在你采用了Logback的情况下,任然可以使用Java Util Logging, Commons Logging, Log4J, 或者 SLF4J。
这句话有两层含义:
其一,在使用Logback作为日志接口实现的情况,仍然可以使用其它日志实现(eg:log4j)。可查看第四节第二点
其二,在默认使用的Commons Logging作为日志接口的情况下,任然可以使用SLF4J作为日志接口。可查看第四节第一点
总结:Spring Boot默认使用Commons Logging与Logback作为日志文件系统组合。在使用默认日志系统的情况,仍然可以使用其它的日志系统接口与日志系统实现。
二、Spring Boot日志的高级配置
- 注:为简化问题,此处选择兼容性较好的SLF4J与Logback作为演示基础
2.1、application.yaml配置方式
文件名与文件路径
logging.file.path logging.file.name 示例 描述 无 无 只在控制台输出 无 配置文件名 my.log或/var/log/my.log 输出到特定的文件中。 配置路径 无 /var/log 输出到文件夹中,文件名为spring.log tips :Logback独有的日志配置,无法在application.yaml中配置。这里只能配置一些基础内容。name与path不能同时使用,就算同时使用也只会有
logging.file.path
生效其它文件属性配置参数
日志文件的最大大小:默认为10M,可通过
logging.file.max-size
配置。日志文件存储的时间:默认存储最近7天,可通过
logging.file.max-history
配置。日志文档的总大小:当日志文档总大小超过该阈值会删除备份,可通过
logging.file.total-size-cap
。强制启动时清理日志:
logging.file.clean-history-on-start
。控制台日志输出过滤:
logging.pattern.console
。日志的日期格式:
logging.pattern.dateformat
过滤日志等级:
logging.pattern.level
日志滚动的名字:
logging.pattern.rolling-file-name
,默认的名字为${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
tips: 仅支持Logback
日志的等级
- 配置全局的日志等级:
logging.level.root
- 配置包的日志等级:
logging.level.包名
(eg:logging.level.org.hibernate
)
- 配置全局的日志等级:
日志分组
- 解释:通过日志分组,可以同时修改多个包的日志输出等级
- 分组:
logging.group.分组名
(eg :**logging.group.tomcat**=org.apache.catalina, org.apache.coyote, org.apache.tomcat
) - 修改输出等级:
logging.level.分组名
(eg :logging.level.tomcat
)
tips: Spring Boot中带有默认的日志分组,可前往官网自行查看,日志分组
2.2、日志的xml配置方式
2.2.1、Spring Boot加载xml
修改配置,指定xml位置:
logging.config
可以配置加载xml路径默认加载配置
日志系统 配置方式 Logback logback-spring.xml
,logback-spring.groovy
,logback.xml
, 或logback.groovy
Log4j2 log4j2-spring.xml
或log4j2.xml
JDK (Java Util Logging) logging.properties
2.2.2、Spring Boot中配置logback-spring.xml
- 注: 本文不关注logback的xml中的具体内容,因而可自行百度查询各个字段含义
1 |
|
2.2.3、Spring Boot中配置log4j2-spring.xml
注: 本文不关注logback的xml中的具体内容,因而可自行百度查询各个字段含义
使用log4j2作为Spring Boot的日志系统,需要先将”Starts”中的Logback排除,增加Log4j2的Spring Boot包。日志接口仍然采用SLF4J!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>xml配置文件内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<Configuration status="OFF" monitorInterval="1800">
<properties>
<property name="LOG_HOME">D:/test</property>
<property name="FILE_NAME">stdout</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<RollingFile name="running-log" fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"
immediateFlush="true">
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.cff" level="debug" additivity="true">
<AppenderRef ref="running-log" />
<AppenderRef ref="Console" />
</Logger>
<Root level="info">
<!-- 这里是输入到文件,很重要 -->
<AppenderRef ref="running-log" />
<!-- 这里是输入到控制台 -->
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
2.2.4、关于log4j的特殊说明
- 根据文中的意思,log4j日志系统具有重大缺陷,因而建议将日志系统切换为log4j2或logback。原文内容
三、Spring Boot日志文件系统的依赖关系
Logback是”Start”中默认引入的日志系统
Log4J2需要单独引入,引入时需要排除Logback
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
四、日志接口与日志实现对Spring Boot日志输出的影响简谈
在Spring Boot中使用Commons Logging或SLF4J,那么实现可以随意使用Logback或Log4J,影响日志输出的将只与它们的配置方式有关,Spring Boot的配置方式可查看第三章。其中关于Log4J的使用可参考上文。关于Logback或Log4J对于Spring Boot日志输出的影响,可看下表:
日志系统 yaml配置 xml配置 解释与结论 Logback 不配置 log4j2-spring.xml 由于引入的Logback日志系统,配置将以YAML中的配置为准,即只输出到控制台 Logback 不配置 logback-spring.xml 由于引入Logback日志系统,配置将以logback.xml中的配置为准 Log4J 不配置 logback-spring.xml 由于引入的Log4J日志系统,配置将以YAML中的配置为准,即只输出到控制台 Log4J 不配置 log4j2-spring.xml 由于引入Log4J日志系统,配置将以log4j2.xml中的配置为准 Logback 配置xml文件为log4j2.xml log4j2-spring.xml 将以yaml中配置的xml文件路径为准,日志输出以xml中内容为准 Log4J 配置xml文件为logback.xml logback-spring.xml 将以yaml中配置的xml文件路径为准,日志输出以xml中内容为准 tips : 日志接口Commons Logging或SLF4J可以同时使用
在Spring Boot程序运行过程中,通过使用
@log4j2、@log等
这种具体的日志系统而不是日志系统接口- 注:这种情况下,只要在maven中引入了对应的日志系统实现包就可以在Spring Boot中使用,并且任然可以打印到控制台,只是可能存在无法输出到文件中。具体原因是你Spring Boot使用的是Logback日志系统,你单独使用的是Log4j2,那么将无法输出到文件中。
五、Spring Boot与lombok的结合使用
5.1、lombok在IDEA与Maven中的安装
- 本人使用的是Idea,因而在Plugins中搜索lombok,安装对应的插件。
- 在Maven引入lombok的依赖
5.2、lombok在IDEA与Maven的作用
Plugins中的lombok作用:是防止IDEA的自动语法检查导致的报错。原因是在maven中包引入后,lombok会在编译期间对代码进行修改,但是IDEA并不知道这些修改(eg:getValue()方法会错误),因而需要引入lombok的插件
Maven中的lombok作用:实现JSR269api,修改AST(抽象语法树)
tips:上诉内容属于lombok的实现原理,具体内容我参考了这篇博客《lombok原理分析与功能实现》
5.3、lombok的使用(日志方面)
@CommonsLog
1
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Flogger
1
private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass();
@JBossLog
1
private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
@Log
1
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j
1
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2
1
private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j
1
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j
1
private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
@CustomLog
1
private static final com.foo.your.Logger log = com.foo.your.LoggerFactory.createYourLogger(LogExample.class);
tips:主要的使用内容,可点击lombok日志使用