本帖最後由 陳明河 於 2014-8-19 15:20 編輯
考慮到logback日誌組件性能比log4j好,所以項目開發過程中拋棄log4j改用logback。 log4j遷移到logback的步驟(只要三步):
第一 引入logback需要的jar包
-
<!-- logback日誌配置開始 -->
-
<dependency>
-
<groupId>ch.qos.logback</groupId>
-
<artifactId>logback-core</artifactId>
-
<version>1.1.2</version>
-
</dependency>
-
<dependency>
-
<groupId>ch.qos.logback</groupId>
-
<artifactId>logback-access</artifactId>
-
<version>1.1.2</version>
-
</dependency>
-
<dependency>
-
<groupId>ch.qos.logback</groupId>
-
<artifactId>logback-classic</artifactId>
-
<version>1.1.2</version>
-
</dependency>
-
<dependency>
-
<groupId>org.slf4j</groupId>
-
<artifactId>log4j-over-slf4j</artifactId>
-
<version>1.7.7</version>
-
</dependency>
-
<!-- logback日誌配置結束 -->
複製代碼
第二 刪除src下的log4j.properties文件,在src下創建logback.xml配置文件
項目之前的使用log4j.properties可以用http://logback.qos.ch/translator/轉換到等價的logback配置文件。PS:轉換後的配置文件,pattern參數需要修改。
如log4j的pattern配置 %-d{yyyy-MM-dd HH:mm:ss,SSS} [%c:%L]-[%p] %m%n 在logback裏面不在起效。
我把它調整爲 %date [%level] [%thread] %logger{80} [%file : %line] %msg%n
另外按日期產生日誌文件策略的pattern也需要修改(具體查看下文的logback.xml配置文件)。
具體含義是:
參數 |
含義 |
%date |
表示日期格式(yyyy-MM-dd HH:mm:ss,SSS) |
%level |
表示日誌的級別 |
%thread |
表示輸出產生該日誌的線程名 |
%logger{80} |
表示logger名字最長80個字符,否則按照句點(.)分割 |
%file |
表示文件名 |
%line |
表示第幾行 |
%msg |
表示輸出信息 |
%n |
表示換行 |
下面粘貼出項目在替換logback之前的log4j配置文件:
-
### direct log messages to stdout
-
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-
log4j.appender.stdout.Target=System.out
-
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} %m [%c:%L]-[%p] %n
-
-
### log messages to file
-
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
-
log4j.appender.R.File=../logs/vod.log
-
log4j.appender.R.DatePattern='.'yyyy-MM-dd
-
log4j.appender.R.layout=org.apache.log4j.PatternLayout
-
log4j.appender.R.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c:%L]-[%p] %m%n
-
-
log4j.appender.DC=org.apache.log4j.DailyRollingFileAppender
-
log4j.appender.DC.File=../logs/devicecontrol.log
-
log4j.appender.DC.DatePattern='.'yyyy-MM-dd
-
log4j.appender.DC.layout=org.apache.log4j.PatternLayout
-
log4j.appender.DC.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c:%L]-[%p]-[%t] %m%n
-
-
-
### Application log config
-
log4j.rootLogger=info,stdout,R
-
-
### set log levels
-
log4j.logger.org.springframework=error
-
log4j.logger.org.quartz.simpl=error
-
log4j.logger.org.hibernate=error
-
log4j.logger.org.apache=error
-
-
log4j.logger.com.thunisoft.summer=warn
-
log4j.logger.com.thunisoft.test=error
-
log4j.logger.com.thunisoft.artery=error
-
log4j.logger.com.thunisoft.crs=error
-
log4j.logger.com.thunisoft.cas.service.devicecontrol=debug,DC
-
-
log4j.logger.jdbc.sqlonly=INFO
-
log4j.logger.jdbc.sqltiming=DEBUG
-
log4j.logger.jdbc.audit=OFF
-
log4j.logger.jdbc.resultset=OFF
-
log4j.logger.jdbc.connection=OFF
複製代碼
下面粘貼出項目使用的logback.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
<configuration>
-
<appender name="DC" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
<File>../logs/devicecontrol.log</File>
-
<encoder>
-
<pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
-
</encoder>
-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
<fileNamePattern>../logs/devicecontrol.log.%d{yyyy-MM-dd}</fileNamePattern>
-
</rollingPolicy>
-
</appender>
-
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
-
<Target>System.out</Target>
-
<encoder>
-
<pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
-
</encoder>
-
</appender>
-
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-
<File>../logs/vod.log</File>
-
<encoder>
-
<pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
-
</encoder>
-
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
<fileNamePattern>../logs/vod.log.%d{yyyy-MM-dd}</fileNamePattern>
-
</rollingPolicy>
-
</appender>
-
<logger name="org.springframework" level="error"/>
-
<logger name="com.thunisoft.crs" level="error"/>
-
<logger name="jdbc.connection" level="OFF"/>
-
<logger name="com.thunisoft.artery" level="error"/>
-
<logger name="com.thunisoft.cas.service.devicecontrol" level="debug">
-
<appender-ref ref="DC"/>
-
</logger>
-
<logger name="org.apache" level="error"/>
-
<logger name="jdbc.resultset" level="OFF"/>
-
<logger name="com.thunisoft.summer" level="warn"/>
-
<logger name="org.hibernate" level="error"/>
-
<logger name="jdbc.audit" level="OFF"/>
-
<logger name="com.thunisoft.test" level="error"/>
-
<logger name="jdbc.sqlonly" level="INFO"/>
-
<logger name="jdbc.sqltiming" level="DEBUG"/>
-
<logger name="org.quartz.simpl" level="error"/>
-
<root level="info">
-
<appender-ref ref="Console"/>
-
<appender-ref ref="FILE"/>
-
</root>
-
</configuration>
複製代碼
第三 把打印日誌類使用的logger類替換爲SLF4J的logger類
如果軟件只調用了
log4j的客戶端API
或Jakarta Commons Logging (JCL) API
或java.util.logging API
就能用SLF4J遷移工具(http://www.slf4j.org/migrator.html)自動遷移到SLF4J。
下面是slf4j官網遷移log4j代碼的示例:
MyClass is a sample class using JCL. Here it is before:
-
package some.package;
-
-
import org.apache.commons.logging.Log;
-
import org.apache.commons.logging.LogFactory;
-
-
public MyClass {
-
-
Log logger = LogFactory.getLog(MyClass.class);
-
-
public void someMethod() {
-
logger.info("Hello world");
-
}
-
}
複製代碼
and after migration:
-
package some.package;
-
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
-
public MyClass {
-
-
Logger logger = LoggerFactory.getLogger(MyClass.class);
-
-
public void someMethod() {
-
logger.info("Hello world");
-
}
-
}
複製代碼
至此,log4j遷移到logback完成。 |