首先展現一個完整的示例以供參考。java
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds" debug="false"> <contextName>logback</contextName> <timestamp key="ts" datePattern="yyyyMMdd'T'HHmmss"/> <property name="log.path" value="F:/logs/logback" /> <property name="log.bak.path" value="F:/logs/logback/bak" /> <property name="charset" value="UTF-8" /> <property name="log.pattern.one" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/> <property name="log.pattern.two" value="[${ts}] [%5level] %logger{0} - %msg%n"/> <!--輸出到控制檯--> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <Pattern>${log.pattern.two}</Pattern> <charset>${charset}</charset> </encoder> </appender> <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/context-info.log</file> <append>true</append> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <Pattern>${log.pattern.one}</Pattern> <charset>${charset}</charset> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.bak.path}/info/context-info-%d{yyyyMMddHHmm}-%i.zip</fileNamePattern> <maxHistory>10</maxHistory> <maxFileSize>1KB</maxFileSize> <totalSizeCap>1MB</totalSizeCap> </rollingPolicy> </appender> <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/warn.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>${log.bak.path}/warn/warn-%i.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>5</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>1KB</maxFileSize> </triggeringPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <Pattern>${log.pattern.one}</Pattern> <charset>${charset}</charset> </encoder> </appender> <appender name="ERROR" class="ch.qos.logback.core.FileAppender"> <file>${log.path}/error.log</file> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <Pattern>${log.pattern.one}</Pattern> <charset>${charset}</charset> </encoder> </appender> <!-- <logger name="org.springframework.web" level="info"/>--> <!-- <logger name="org.curitis.test" level="info" addtivity="true">--> <!-- <appender-ref ref="INFO"/>--> <!-- </logger>--> <root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="INFO" /> <appender-ref ref="WARN" /> <appender-ref ref="ERROR" /> </root> </configuration>
測試代碼:web
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LogTest { private static final Logger logger = LoggerFactory.getLogger(LogTest.class); public static void main(String[] args) { while (true) { logger.info("info"); logger.warn("warn"); logger.error("error"); } } }
日誌級別從低到高分爲:spring
scan:當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲trueexpress
scanPeriod:設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。app
debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。測試
配置屬性,以便於在其餘配置使用,一些公用的配置例如,日誌輸出格式,日誌文件路徑等就能夠配置爲property。編碼
<timestamp key="ts" datePattern="yyyyMMdd'T'HHmmss"/> <property name="log.path" value="F:/logs/logback/" /> <property name="log.bak.path" value="F:/logs/bak/" /> <property name="charset" value="UTF-8" /> <property name="log.pattern.one" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/> <property name="log.pattern.two" value="[${ts}] [%5level] %logger{0} - %msg%n"/>
我願意吧appender翻譯爲輸出器,appender主要有3中:lua
ConsoleAppender是輸出到控制檯,RollingFileAppender是滾動日誌輸出器,通常用於輸出須要保存一段時間的日誌,FileAppender通常是數據量比較小特別關注的日誌輸出器。spa
每個appender都須要一個encoder,主要用於指定輸出日誌格式和編碼。翻譯
<encoder> <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</Pattern> <charset>UTF-8</charset> </encoder>
Appender能夠配置多個過濾器,過濾器主要有3中:
臨界值過濾器,Threshold是閾值,臨界值的意思,表示過濾掉低於指定臨界值的日誌。
當日志級別等於或高於臨界值時,過濾器返回NEUTRAL,當日志級別低於臨界值時,日誌會被拒絕。
例如,過濾掉全部低於INFO級別的日誌:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter>
過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。返回DENY,日誌將當即被拋棄再也不通過其餘過濾器;返回NEUTRAL,有序列表裏的下個過濾器過接着處理日誌;返回ACCEPT,日誌會被當即處理,再也不通過剩餘過濾器。
過濾器被添加到<Appender> 中,爲<Appender> 添加一個或多個過濾器後,能夠用任意條件對日誌進行過濾。<Appender> 有多個過濾器時,按照配置順序執行。
級別過濾器,level是級別的意思,會根據日誌級別進行過濾。
若是日誌級別等於配置級別,過濾器會根據onMath和onMismatch的配置接收或拒絕日誌,onMath和onMismatch能夠配置下面3個值:
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>
經過LevelFilter能夠將指定級別的日誌輸出到指定文件。
表達式過濾器,評估、鑑別日誌是否符合指定條件。須要額外的兩個jar包:
表達式過濾器很強大,可是不多用,它能夠根據event、message、hrowable、logger、level、loggerContext、marker等過濾。
<filter class="ch.qos.logback.core.filter.EvaluatorFilter"> <evaluator> <expression>return message.contains("connection fail");</expression> </evaluator> <OnMatch>ACCEPT</OnMatch> <OnMismatch>DENY</OnMismatch> </filter>
上面的示例是隻接收日誌中包含connection fail的日誌,還能夠根據throwable過濾出指定異常的的日誌信息,輸出到指定文件,可是通常沒有必要。
Policy主要有3個:
FixedWindowRollingPolicy通常和SizeBasedTriggeringPolicy組合使用。
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/context-info.log</file> <append>true</append> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <Pattern>${log.pattern.one}</Pattern> <charset>${charset}</charset> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.bak.path}/info/context-info-%d{yyyyMMddHHmm}-%i.zip</fileNamePattern> <maxHistory>10</maxHistory> <maxFileSize>1KB</maxFileSize> <totalSizeCap>1MB</totalSizeCap> </rollingPolicy> </appender>
SizeAndTimeBasedRollingPolicy須要注意的地方是fileNamePattern的配置。 既然是時間和大小,那麼就要設置時間的策略,時間策略就是根據fileNamePattern的%d{yyyyMMddHHmm}部分來的。 %d{yyyyMMddHHmm}就是每分鐘滾動一次,生成一個新的文件 %d{yyyyMMddHH}就是每一小時滾動一次,生成一個新的文件 %d{yyyyMMdd}就是天天滾動一次,生成一個新的文件
%i部分是指定大小的,由於不知道日誌有多少,因此是%i,實際上根據maxFileSize來生成,一個文件大小達到maxFileSize就生成一個新文件。
例如上面的配置就是${log.path}/context-info.log文件一分鐘內就會至少會生成一個文件,${log.bak.path}/info/context-info-201909281200-0.zip。
若是一分鐘以內context-info.log超過1kb就會生成多個。
上面的maxFileSize是爲了測試設置很小,實際能夠設置大一些,例如,若是日誌要存入hdfs就能夠把maxFileSize設置爲128M,這樣恰好是一個hdfs的block。
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${log.path}/warn.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>${log.bak.path}/warn/warn-%i.zip</fileNamePattern> <minIndex>1</minIndex> <maxIndex>5</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>1KB</maxFileSize> </triggeringPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder> <Pattern>${log.pattern.one}</Pattern> <charset>${charset}</charset> </encoder> </appender>
固定窗口策略,最重要的配置是maxIndex,就是最大下標。結合SizeBasedTriggeringPolicy,達到指定文件大小就會生成一個新的壓縮文件。
例如,上面的配置就會最多生成5個壓縮文件,每當warn.log達到1kb的時候就會生成一個warn-i.zip的壓縮文件。
壓縮文件最多5個,會循環覆蓋。
給指定的包或者類配置日誌輸出
<logger name="org.springframework.web" level="info"/> <logger name="org.curitis.test" level="info" addtivity="false"> <appender-ref ref="INFO"/> </logger>
logger默認使用的日誌輸出地方是控制檯,能夠經過appender-ref修改。level指定輸出級別,addtivity設置爲false表示,不在其餘日誌輸出器中輸出了。
配置日誌輸出器
<root level="info"> <appender-ref ref="CONSOLE" /> <appender-ref ref="INFO" /> <appender-ref ref="WARN" /> <appender-ref ref="ERROR" /> </root>
level指定公共默認最低輸出級別,例如若是設置爲WARN,則低於WARN的信息都不會輸出
包含其餘配置文件,能夠是一些固定的配置,例如指定庫的日誌輸出配置文件。
<include resource="classpath:logback-base.xml" />
指定環境環境:
<springProfile name="dev"> <logger name="org.springframework" level="WARN"/> </springProfile>
彩色日誌: org.springframework.boot.logging.logback.ColorConverter org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter