Springboot-日志配置
Spring Boot 日志记录
Spring Boot为所有的内部日志记录使用Commons Logging***?***,但开放底层日志实现,提供了Java Util Logging、Log4J2和Logback的默认配置,每种情况下,日志记录其都被预先配置为使用控制台输出,可选的文件输出也是可用的。如果使用了默认的“Stater”,spring-boot-stater->spring-boot-stater-logging,Logback用于记录日志。
日志格式
Spring Boot 的默认日志(默认情况使用Logback)输出以下项目:
- 日期和时间:毫秒精度,易于排序。
- 日志级别:ERROR、WARN、INFO、DEBUG、TRACE(Logback中没有FATAL级别,它映射到ERROR)
- 进程 ID。
- 用于区分实际日志消息开始的分隔符。---
- 线程名称:用方括号括起来(对于控制台输出,可能会截断)。
- 记录器名称:这通常是源类名称(通常缩写)。
- 日志消息。
可以使用 logging.pattern.console来定义
控制台输出
日志默认输出到控制台,级别为INFO
文件输出
启用文件输出,需要设置 logging.file.name
or logging.file.path
logging.file.name
: 日志写入特定的文件,可以是绝对路径也可以是相对路径
logging.file.path
:日志写入特定目录的spring.log文件,可以是绝对路径也可以是相对路径
这两个参数不会同时生效,文件的级别要更高
logging.file.max-size:文件大小(默认单位为字节,可以使用KB、MB、GB),默认10M,超过之后就会分割并压缩存档
logging.file.max-history
:最大保留天数,默认为7天,超过之后就会删除
logging.file.total-size-cap
:日志存档总大小,超过后历史文件也会别删除
logging.file.clean-history-on-start
: 应用程序启动时强制进行日志存档清理
日志级别
所有受支持的日志系统都可以在Spring环境中通过ogging.level.<logger-name>=<level>
设置日志级别,logging.level.root
可以设置ROOT级别
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
也可以使用环境变量来设置,例如 LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG
日志组
我们经常会用到将相关的记录器分组到一起,以便可以同时配置它们。所以Spring Boot允许在 Spring 中定义日志记录组
logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
logging.level.tomcat=TRACE
Spring Boot提供了一下的预定义组:
web | org.springframework.core.codec , org.springframework.http , org.springframework.web , org.springframework.boot.actuate.endpoint.web , org.springframework.boot.web.servlet.ServletContextInitializerBeans
|
---|---|
sql | org.springframework.jdbc.core , org.hibernate.SQL , org.jooq.tools.LoggerListener
|
自定义日志配置
可以引入对应的jar包来激活适当的日志系统,也可以添加配置文件来对日志系统进行配置
根据日志系统,将加载对应的配置文件
Logback | logback-spring.xml , logback-spring.groovy , logback.xml , or logback.groovy
|
---|---|
Log4j2 | log4j2-spring.xml or log4j2.xml
|
JDK (Java Util Logging) | logging.properties
|
建议使用带有 -spring
变体的配置文件,如果使用标准的配置文件,Spring可能无法完全控制日志的初始化。也不建议使用JUL(已知的类加载问题)
默认的Logback配置文件在 org/springframework/boot/logging/logback/base.xml
我们也可以直接在配置文件引入默认的配置然后再覆盖默认配置
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
<springProfile name="test,dev">
<logger name="org.springframework.web" level="INFO">
<appender-ref ref="FILE" />
</logger>
<logger name="com.example" level="INFO" />
</springProfile>
<springProfile name="prod">
<logger name="org.springframework.web" level="ERROR">
<appender-ref ref="FILE" />
</logger>
<logger name="com.example" level="ERROR" />
</springProfile>
</configuration>
Spring Boot对logback的扩展
- 特定于配置文件的配置
springProfile 标记,允许根据活动的Spring配置文件选择包括或者排除部分配置,使用name
属性指定配置文件,可以包含名称或表达式
<springProfile name="staging">
</springProfile>
<springProfile name="dev | staging">
</springProfile>
<springProfile name="!production">
</springProfile>
- 环境属性
springProperty 标记,允许您公开 Spring 中的属性,供logback中使用。source
指定要用的属性,name
将此定义为占位符/变量,可以用defaultValue
提供默认值
<springProperty name="level" source="logger.a.level" defaultValue="INFO"/>
<root level="${level}">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
Log4J2
Log4j2已经不仅仅是Log4j的一个升级版本了,它从头到尾都被重写了,并且参考了Logback,相对来讲功能更好,性能更强
- 引入依赖
<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>
发现我们自定义的logback的配置已经失效了,当然配置文件中的logging的配置依然是有效的
默认的Log4J2的配置文件在 org/springframework/boot/logging/log4j2/log4j2.xml和org/springframework/boot/logging/log4j2/log4j2-file.xml
自定义配置log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO" monitorInterval="30">
<appenders>
<console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%X{logId}] [%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n" />
</console>
<RollingFile name="RollingFileInfo"
fileName="${sys:user.home}/logs/kayak-api.log"
filePattern="${sys:user.home}/logs/kayak-api/$${date:yyyy-MM}/kayak-api-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="INFO" onMatch="ACCEPT"
onMismatch="DENY" />
<ThresholdFilter level="WARN" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout
pattern="[%X{logId}] [%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn"
fileName="${sys:user.home}/logs/kayak-api-warn.log"
filePattern="${sys:user.home}/logs/kayak-api/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
<Filters>
<ThresholdFilter level="WARN" onMatch="ACCEPT"
onMismatch="DENY" />
<ThresholdFilter level="ERROR" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout
pattern="[%X{logId}] [%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<RollingFile name="RollingFileError"
fileName="${sys:user.home}/logs/kayak-api-error.log"
filePattern="${sys:user.home}/logs/kayak-api/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="ERROR" />
<PatternLayout
pattern="[%X{logId}] [%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
</RollingFile>
<Gelf name="logstash-gelf" host="tcp:10.129.51.115" port="5044"
version="1.1" ignoreExceptions="true" extractStackTrace="true"
filterStackTrace="false">
<Field name="level" pattern="%level" />
<Field name="className" pattern="%C" />
<Field name="method" pattern="%M" />
<Field name="line" pattern="%L" />
<Field name="server" pattern="%host" />
<Field name="id" pattern="%X{logId}" />
</Gelf>
</appenders>
<loggers>
<logger name="org.springframework" level="INFO">
</logger>
<logger name="org.mybatis" level="INFO">
</logger>
<root level="INFO">
<appender-ref ref="Console" />
<appender-ref ref="logstash-gelf" />
</root>
</loggers>
</configuration>
PatternLayout定义了输出日志时的格式: %d{HH:mm:ss.SSS} 表示输出到毫秒的时间 %t 输出当前线程名称 %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0 %logger 输出logger名称,因为Root Logger没有名称,所以没有输出 %msg 日志文本 %n 换行 其他常用的占位符有: %F 输出所在的类文件名,如Client.java %L 输出行号 %M 输出所在方法名 %l 输出语句所在的行数, 包括类名、方法名、文件名、行数 fileName 指定当前日志文件的位置和文件名称 filePattern 指定当发生Rolling时,文件的转移和重命名规则 SizeBasedTriggeringPolicy 指定当文件体积大于size指定的值时,触发Rolling DefaultRolloverStrategy 指定最多保存的文件个数 TimeBasedTriggeringPolicy 这个配置需要和filePattern结合使用,注意filePattern中配置的文件重命名规则是${FILE_NAME}-%d{yyyy-MM-dd HH-mm}-%i,最小的时间粒度是mm,即分钟,TimeBasedTriggeringPolicy指定的size是1,结合起来就是每1分钟生成一个新文件。如果改成%d{yyyy-MM-dd HH},最小粒度为小时,则每一个小时生成一个文件。