特點(diǎn)
- 配置簡單脆丁,易于上手
- 一個日志文件中只能某一個級別的日志
- 一個類中可以指定多個不同的日志构眯,并且生成的每個日志文件中只包含其本身的內(nèi)容
- 可以關(guān)閉或者打開某幾個包的日志,并且可以設(shè)置不同的包使用不同的日志級別
一忠烛、易用性
logback的易用性不用多講坯墨,只需要通過下面兩行就可以在console中輸出日志:
Logger debugLogger = LoggerFactory.getLogger(MyClass.class);
logger.info("This is a log");
程序運(yùn)行時寂汇,logback會查找默認(rèn)的配置文件logback.xml或者logback-test.xml文件,如果沒有找到它就會使用默認(rèn)的配置捣染,將日志打印到console中骄瓣。下面是一個配置文件示例:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- 設(shè)置日志輸出根目錄 -->
<property name="log.dir" value="logs" />
<property name="encoding" value="UTF-8" />
<property name="pattern"
value="%d{yyyy-MM-dd.HH:mm:ss} %-5level [%thread] %logger.%M:%L %msg%n" />
<!-- 控制臺輸出日志 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${pattern}</pattern>
</layout>
</appender>
<!-- 主日志 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>main.log</File>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>${log.dir}/main.log</file>
<prudent>false</prudent>
<encoder charset="UTF-8">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.dir}/main.%d{yyyy-MM-dd-HH}.log.gz</fileNamePattern>
</rollingPolicy>
</appender>
<!-- 錯誤日志 -->
<appender name="ERROR_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>error.log</File>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<file>${log.dir}/error.log</file>
<prudent>false</prudent>
<encoder charset="UTF-8">
<pattern>${pattern}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.dir}/error.%d{yyyy-MM-dd-HH}.log.gz</fileNamePattern>
</rollingPolicy>
</appender>
<logger name="com.qunar.fresh2017.exam1">
<level value="INFO" />
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="ERROR_FILE" />
</logger>
</configuration>
二、日志級別限制
在多數(shù)的Log工具中耍攘,級別是可以傳遞榕栏,例如如果指定了日志輸出級別為DEBUG畔勤,那么INFO、ERROR級別的log也會出現(xiàn)在日志文件扒磁。這種默認(rèn)給程序的調(diào)試帶來了很多的麻煩庆揪。而在logback中可以通過appender中的filter來嚴(yán)格限制日志的輸出級別:
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
上面的設(shè)置中只會在文件中出現(xiàn)級別為INFO的日志內(nèi)容。
三妨托、同一個類中包含不同的日志
有時候一個類中可能要求打印不同的日志信息缸榛,例如有的用來調(diào)試,有的用來記錄程序運(yùn)行中的某些參數(shù)的變化等等兰伤。這時候可以通過下面的語句聲明不同的日志:
<appender name="monitor" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.dir}/monitor.log</File>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} : %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.dir}/sensitive.log.%d{yyyy-MM-dd}</fileNamePattern>
</rollingPolicy>
</appender>
# 這里通過設(shè)置additivity="false"禁止monitor里的內(nèi)容向上傳遞内颗,否則會同時顯示在默認(rèn)的日志中。
<logger name="monitor" additivity="false" level="INFO">
<span style="white-space:pre"></span>
<appender-ref ref="monitor" />
<span style="white-space:pre"></span>
</logger>
Logger debugLogger = LoggerFactory.getLogger(MyClass.class);
Logger monitorLogger = LoggerFactory.getLogger("monitor");
四敦腔、精確控制日志的應(yīng)用范圍
在程序調(diào)試中起暮,經(jīng)常出現(xiàn)的情況是:錯誤只在某一個或者幾個類或者包里,所以只需要打開這幾個類或者包里的DEBUG級別的log会烙。在以前的項目负懦,使用spring和hibernate時,一旦打開DEBUG級別的log柏腻,程序本身的debug信息就會被Spring和Hibernate的大量日志淹沒纸厉,大大降低了調(diào)試的效率。而logback讓這一切變的簡單起來了:
<logger name="org" level="ERROR" />
這一行就將org包下面的所有日志級別設(shè)為了ERROR五嫂,不會再打擾我們的DEBUG颗品。