1、項目中大多用的都是Log4j作的,而這次遷移到logback有以下理由:java
一、logback是log4j團隊新做,重寫了內部實現,在速度獲得提高的同時,佔用更少的內存;web
二、log4j與logback都是slf4j抽象層的實現,遷移工做量較小,也不存在兼容問題;spring
注:在代碼中調用log對象,應該用slf4j提供的工廠類如:sql
private static final Logger log = LoggerFactory.getLogger(xx.class);apache
這樣寫的另一個好處,日誌框架發生變更時,也無需更改代碼。api
三、logback配置使用xml或者Groovy文件;服務器
四、熱部署。log4j默認不支持熱部署,須要在web.xml或者其餘配置文件中啓動log4j定時掃描配置文件的功能,以達到熱部署的目的。而logback無需單獨配置,默認開啓自動載入,無需啓用單獨的線程進行掃描。app
五、I/O錯誤恢復功能。當文件服務器宕機時,無需重啓應用服務器,日誌功能仍舊正常工做,當文件服務器恢復工做後,logback的appender會快速從上一個錯誤中恢復。框架
六、自動清除歷史日誌文件。log4j只能經過設置maxBackupIndex值固定日誌文件數量,而logback經過maxHistory值來刪除N天前的日誌。eclipse
七、自動壓縮歸檔日誌文件。RollingFileAppender能夠在回滾操做中,自動壓縮歸檔日誌文件。壓縮一般是異步執行的,因此即便是很大的日誌文件,你的應用都不會所以而被阻塞。
八、logback的謹慎模式。多個JVM能夠向同一個日誌文件輸出日誌,而log4j想實現這樣的功能較爲麻煩。
九、更精細的日誌過濾。log4j只能經過日誌級別進行過濾,而logback能夠在同級別日誌下經過表達式作更精確的過濾,這讓系統日誌分析問題定位更加的高效。
十、SiftingAppender是logback的一個追加器,經過SiftingAppender能夠根據條件將日誌篩選拆分。如按照會話輸出多個日誌文件。
2、logback配置
pom.xml
<!-- logback日誌 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <scope>runtime</scope> </dependency>
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOG_HOME" value="/Users/xubin/WorkSpaces/eclipseWorkSpace/logs" /> <!-- 控制檯輸出 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符 --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender> <!-- 按照天天生成日誌文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_HOME}/applog.%d{yyyy-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日誌文件最大的大小 --> <!-- <triggeringPolicy --> <!-- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> --> <!-- <MaxFileSize>10MB</MaxFileSize> --> <!-- </triggeringPolicy> --> </appender> <!--myibatis log configure --> <logger name="com.apache.ibatis" level="TRACE" /> <logger name="java.sql.Connection" level="DEBUG" /> <logger name="java.sql.Statement" level="DEBUG" /> <logger name="java.sql.PreparedStatement" level="DEBUG" /> <!-- 日誌輸出級別 --> <root level="INFO"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> </configuration>
總結:這次遷移是講log4j遷移到logback,也是由於熱部署和日誌清理等需求促成這次遷移。