logback
一、介紹
logback是由log4j的作者開發的一個開源日志組件,用以替代log4j。
logback由3個部分組成:
♦ logback-core (基礎模塊)
♦ logback-classic (log4j改進版,實現slf4j)
♦ logback-access (與servlet交互的模塊,提供通過Http來訪問日志的功能)
二、logback對比log4j
1. 性能
logback重寫內核,性能提升,內存加載小。
2. 充分測試
以年為單位的測試時間。
3. logback-classic原生實現slf4j
log4j還需要一個中間轉換層。
4. 文檔內容豐富
官網200pages+。
5. XML配置文件熱加載
logback-classic能自動重新加載配置文件。
6. 從I/O錯誤中優雅恢復
RollingFileAppender能夠非常友好地從I/O異常中恢復。
7. 自動刪除日志歸檔
可以控制日志文件的最大數量或超時刪除時間。
8. 自動壓縮日至歸檔
自動壓縮已經打出來的日志文件,壓縮過程應用不受影響。
9. 配置文件適應不同環境
加入條件判斷,區分開發,測試,生產。
10. SiftingAppender
可篩選Appender。
11. 異常棧信息帶有包信息
打堆棧樹日志時,有包的信息。
三、logback依賴jar
♦ slf4j-api
♦ logback-core
♦ logback-classic
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.9</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.0.13</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
logback-mail
一、發送郵件依賴jar
♦ janino
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.4</version>
</dependency>
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>2.7.8</version>
</dependency>
二、配置logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台輸出 -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<!-- 格式化輸出:%date(d%)表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度, -->
<!-- %logger{36}表示logger名字最長36個字符,否則按照句點分割,%msg:日志消息,%n是換行符 -->
<pattern>%date{MM:dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 輸出DEBUG級別日志文件的appender -->
<appender name="RollingFileRun" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<File>/data/tomcat/runtime/debug.log</File>
<!-- 按每小時滾動文件,如果一個小時內達到100M也會滾動文件, 滾動文件將會壓縮成zip格式, 最多保留672個滾動文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/data/tomcat/runtime/debug-%d{yyyy-MM-dd_HH}.%i.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>672</maxHistory>
</rollingPolicy>
<encoder>
<!-- 格式化輸出:%date(d%)表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度, -->
<!-- %logger{36}表示logger名字最長36個字符,否則按照句點分割,%msg:日志消息,%n是換行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 輸出ERROR級別日志文件的appender -->
<appender name="RollingFileError" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<File>/data/tomcat/error/error.log</File>
<!-- 按每小時滾動文件,如果一個小時內達到100M也會滾動文件, 滾動文件將會壓縮成zip格式, 最多保留672個滾動文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/data/tomcat/error/error-%d{yyyy-MM-dd_HH}.%i.zip</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>672</maxHistory>
</rollingPolicy>
<encoder>
<!-- 格式化輸出:%date(d%)表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度, -->
<!-- %logger{36}表示logger名字最長36個字符,否則按照句點分割,%msg:日志消息,%n是換行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- SMTP server的地址,必需指定。如網易126的SMTP服務器地址是: smtp.126.com -->
<property name="smtpHost" value="smtp.126.com"/>
<!-- SMTP server的端口地址。默認值:25 -->
<property name="smtpPort" value="25"/>
<!-- 發送郵件賬號 -->
<property name="username" value="********@126.com"/>
<!-- 發送郵件密碼(此密碼為網易126郵箱的客戶端授權密碼,不是郵箱登錄密碼,126郵箱需要開啟POP3/SMTP服務、IMAP/SMTP服務才可使用) -->
<property name="password" value="********"/>
<!-- 如果設置為true,appender將會使用SSL連接到日志服務器。默認值:false -->
<property name="SSL" value="false"/>
<!-- 指定發送到那個郵箱,可設置多個<to>屬性,指定多個目的郵箱,收件人賬號多個可以逗號隔開 -->
<property name="email_to" value="********@126.com"/>
<!-- 指定發件人名稱。 -->
<property name="email_from" value="********@126.com" />
<!-- 指定emial的標題,它需要滿足PatternLayout中的格式要求。如果設置成“Log: %logger - %msg”,就案例來講,則發送郵件時, -->
<!-- 標題為“【Error】: com.****.****Task - null.equals”。 -->
<property name="email_subject" value="【Error】: %logger - %msg" />
<!-- 郵件發送的appender -->
<appender name="Email" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<asynchronousSending>false</asynchronousSending>
<SSL>${SSL}</SSL>
<to>${email_to}</to>
<from>${email_from}</from>
<subject>${email_subject}</subject>
<!-- html格式 -->
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<Pattern>%date%level%thread%logger{0}%line%message</Pattern>
</layout>
<!-- 這里采用等級過濾器,指定等級相符才發送,這里指定ERROR級別才發送 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 每個電子郵件只發送一個日志條目 -->
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<bufferSize>1</bufferSize>
</cyclicBufferTracker>
</appender>
<!-- 日志輸出,設置級別,指定appender -->
<root level="DEBUG">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileRun"/>
<appender-ref ref="RollingFileError"/>
<appender-ref ref="Email"/>
</root>
</configuration>
三、設置網易126郵箱
四、使用
logger.error("null.equals");