??之前習(xí)慣了日志配置文件粘貼復(fù)制。今天閑下來的時候,學(xué)習(xí)了Logback的配置新姿勢,以后不再盲目粘貼復(fù)制了。由于Springboot中默認(rèn)的日志配置是Logback,因此本文中也只涉及Logback的配置。
1. 配置整體結(jié)構(gòu)
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>${maskwang-log}</contextName>
<appender>
//xxxx
</appender>
<logger>
//xxxx
</logger>
<root>
//xxxx
</root>
</configuration>
每個日志配置文件的配置都是上面這種形式,基本的結(jié)果如下圖。其中scan表示是否定期掃描更新配置文件,scanPeriod表示掃描的周期,debug設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài),默認(rèn)值為false。
-
appender表示日志輸出的位置,通常有輸出到控制臺的ConsoleAppender,輸出到文體的FileAppender和RollingFileAppender。 -
logger表示需要進(jìn)行自定義日志的位置,即在哪里打需要的日志。通常像下面這樣自定義某個類需要的日志
<logger name="com.maskwang.controller" level="info"
additivity="false">
<appender-ref ref="infoAppender" />
</logger>
-
root表示根logger,也是一種logger,且只有一個level屬性。沒有特別指定logger,那么都是采用root的日志配置。
日志.jpg
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是默認(rèn)值,
它的配置對應(yīng)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>
<!-- 文件最大保存歷史數(shù)量 -->
<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保存的最大文件個數(shù),該例子中表示最多只保存30天的日志,舊的日志將會刪除。 -
pattern表示日志文每條日志的格式如[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n。 -
filter表示過濾不想要級別的日志。LevelFilter類表示過濾特定的級別,該例子中表示該appender只保存INFO級別的日志,其他的日志則忽略。其實還有另外一種類ThresholdFilter,表示只保存該級別或者該級別更高級別的日志。level表示日志級別,onMatch表示如果匹配就記錄,并且不傳遞到下一個過濾器。onMismatch表示不匹配記錄且不傳遞到下一個過濾器。如果需要自定義過濾規(guī)則,則需要繼承Filter,實現(xiàn)decide方法,具體如didi的這篇文章Logback中如何自定義靈活的日志過濾規(guī)則
3. root詳解
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="infoAppender"/>
<appender-ref ref="warnAppender"/>
</root>
- root中通常只有
level一個屬性,表示默認(rèn)的日志級別。然后包括多個appender-ref來給不同級別的日志配置不同的appender。在沒有指定特殊的logger,所有按照root的格式輸出日志。
通過上面三部分,就可以自定義日志輸出。以下附一份完整的日志配置文件,實現(xiàn)把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是默認(rèn)值,
它的配置對應(yīng)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>
<!-- 文件最大保存歷史數(shù)量 -->
<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是默認(rèn)值,
它的配置對應(yīng)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>
<!-- 文件最大保存歷史數(shù)量 -->
<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>
