之前习惯了日志配置文件粘贴复制。今天闲下来的时候,学习了Logback的配置新姿势,以后不再盲目粘贴复制了。由于Springboot中默认的日志配置是Logback,因此本文中也只涉及Logback的配置。
1. 配置整体结构
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>${maskwang-log}</contextName>
<appender>
//xxxx
</appender>
<logger>
//xxxx
</logger>
<root>
//xxxx
</root>
</configuration>
每个日志配置文件的配置都是上面这种形式,基本的结果如下图。其中scan
表示是否定期扫描更新配置文件,scanPeriod
表示扫描的周期,debug
设置为true时,将打印出logback内部日志信息,实时查看logback运行状态,默认值为false。
-
appender
表示日志输出的位置,通常有输出到控制台的ConsoleAppender
,输出到文体的FileAppender
和RollingFileAppender
。 -
logger
表示需要进行自定义日志的位置,即在哪里打需要的日志。通常像下面这样自定义某个类需要的日志
<logger name="com.maskwang.controller" level="info"
additivity="false">
<appender-ref ref="infoAppender" />
</logger>
-
root
表示根logger,也是一种logger,且只有一个level属性。没有特别指定logger
,那么都是采用root
的日志配置。
2. appender详解
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
这种是指定控制台打印的appender,其中CONSOLE_LOG_PATTERN
是自定义的日志打印格式,如[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n
所示。
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 ,注意LOG_PATH是默认值,
它的配置对应application.properties里的logging.path值-->
<file>${LOG_PATH}/info/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>info/info-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
这种是滚动文件文件的appender,也就是每隔一天生成一个日志文件。
-
file
表示存放日志文件的目录。 -
rollingPolicy
表示文件滚动的策略,fileNamePattern
表示每个滚动文件的命名如info-2019-11-19.log
,MaxHistory
保存的最大文件个数,该例子中表示最多只保存30天的日志,旧的日志将会删除。 -
pattern
表示日志文每条日志的格式如[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n
。 -
filter
表示过滤不想要级别的日志。LevelFilter
类表示过滤特定的级别,该例子中表示该appender只保存INFO
级别的日志,其他的日志则忽略。其实还有另外一种类ThresholdFilter
,表示只保存该级别或者该级别更高级别的日志。level
表示日志级别,onMatch
表示如果匹配就记录,并且不传递到下一个过滤器。onMismatch
表示不匹配记录且不传递到下一个过滤器。如果需要自定义过滤规则,则需要继承Filter
,实现decide
方法,具体如didi的这篇文章Logback中如何自定义灵活的日志过滤规则
3. root详解
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="warnAppender"/>
</root>
- root中通常只有
level
一个属性,表示默认的日志级别。然后包括多个appender-ref
来给不同级别的日志配置不同的appender。在没有指定特殊的logger,所有按照root的格式输出日志。
通过上面三部分,就可以自定义日志输出。以下附一份完整的日志配置文件,实现把info
,`warn’级别的日志分别输出到不同的文件中,且生成滚动日志。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- INFO -->
<appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 ,注意LOG_PATH是默认值,
它的配置对应application.properties里的logging.path值-->
<file>${LOG_PATH}/info/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>info/info-%d{yyyy-MM-dd}.log
</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- WARN -->
<appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 ,注意LOG_PATH是默认值,
它的配置对应application.properties里的logging.path值-->
<file>${LOG_PATH}/warn/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>warn/warn-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="com.maskwang.controller" level="info"
additivity="false">
<appender-ref ref="infoAppender" />
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="warnAppender"/>
</root>
</configuration>