spring boot 日志简介
spring boot只依赖 Commons Logging API,而不依赖其他日志(jul、logback、log4j)。要想使用logback,必须引入jcl-over-slf4j
( 实现了 Commons Logging API),将jcl转接到slf4j。所有的spring boot starter都依赖了spring-boot-starter-logging
,pom如下
<dependencies><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-to-slf4j</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jul-to-slf4j</artifactId></dependency></dependencies>
可以看到spring-boot-starter-logging
引入了logback,同时将log4j、jul都转接到slf4j,这就是为什么引入jcl-over-slf4j
就能使logback生效的原因。
如想修改日志级别,在application.properties
中设置logging.level
即可。
.springframework.web=.hibernate=ERROR
通过logging.file
修改日志文件位置。
spring boot 配置logback
类路径下新建logback.xml
或者logback-spring.xml
,推荐使用后者,因为它能利用spring boot既有logback配置。xml与properties方式相比,能更细粒度的控制。
spring boot提供了logback的默认配置org/springframework/boot/logging/logback/base.xml
<included><include resource="org/springframework/boot/logging/logback/defaults.xml" /><property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/><include resource="org/springframework/boot/logging/logback/console-appender.xml" /><include resource="org/springframework/boot/logging/logback/file-appender.xml" /><root level="INFO"><appender-ref ref="CONSOLE" /><appender-ref ref="FILE" /></root></included>
它引入了defaults.xml
、console-appender.xml
、file-appender.xml
defaults.xml
配置了tomcat、hibernate的日志级别,规定了控制台及文件的输出格式。
<included><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /><conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /><conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /><property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/><property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/><logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/><logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/><logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/><logger name="org.mon.util.SecurityUtils" level="WARN"/><logger name="org.apache..NioSelectorPool" level="WARN"/><logger name="org.eclipse.ponent.AbstractLifeCycle" level="ERROR"/><logger name="org.hibernate.validator.internal.util.Version" level="WARN"/></included>
console-appender.xml
使用了defaults.xml
规定的控制台输出格式。
<included><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern></encoder></appender></included>
file-appender.xml
使用了defaults.xml
规定的文件输出格式,并会按照大小和时间分片,文件最大10M。
<included><appender name="FILE"class="ch.qos.logback.core.rolling.RollingFileAppender"><encoder><pattern>${FILE_LOG_PATTERN}</pattern></encoder><file>${LOG_FILE}</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern><maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize><maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory></rollingPolicy></appender></included>
配置logback只输出到文件
新建logback-spring.xml
引入file-appender.xml
,没有引入console-appender.xml
,所以不会输出到控制台。
<?xml version="1.0" encoding="UTF-8"?><configuration><include resource="org/springframework/boot/logging/logback/defaults.xml" /><property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/><include resource="org/springframework/boot/logging/logback/file-appender.xml" /><root level="INFO"><appender-ref ref="FILE" /></root></configuration>
总结
spring boot使用logback
引入jcl-over-slf4j
如果只改变日志级别,在application.properties
中配置logging.level
即可细粒度的控制,新建logback-spring.xml
,酌情引入defaults.xml
、console-appender.xml
、file-appender.xml
logback不起作用,使用了其他日志
在实践中,往往遇到logback不起作用的情况,通过mvn dependency:tree
查看依赖,一般来说都是因为引入了其它日志实现(log4j、apache commons log)导致,控制台一般会有提示,这种情况,排除掉其他日志实现 即可。比如
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><artifactId>log4j</artifactId><groupId>log4j</groupId></exclusion></exclusions></dependency>
参考
spring boot howto-logging