Tuesday, June 05, 2012編寫
1、 如何替換現有的log4j 現有項目:
去掉slf4j-log4j.jar和log4j.jar,添加logback-core.jar、logback-classical.jar。然后刪除log4j.xml并且添加logback的配置文件logback.xml。(應用中有加載log4j配置文件的需要去掉)
這里是針對項目中已經使用了log4j+slf4j組合的情況。
如果現有項目只是使用了log4j,那么需要通過slf4j官方提供的工具修改項目源碼(工具就是slf4j下載文件夾下的slf4j-migrator.jar)。
工具使用方法:http://www.slf4j.org/migrator.html。
如果項目使用的是log4j.properties來配置的,那么可以通過logback官方的工具轉為logback.xml,但如果是log4j.xml,那么還是重新編寫logback.xml比較好。
轉換工具地址:http://logback.qos.ch/translator/ ,
新項目:
直接添加logback-core.jar、logback-classical.jar和log4j-over-slf4j.jar三個jar包,編寫logback.xml配置文件。
2、 重加載配置文件
配置如下:
<configuration scan="true" scanPeriod="30 seconds" >
...
</configuration>
如果不指定scanPeriod,默認情況下是每分鐘重新讀取的配置文件。這里可以通過scanPeriod屬性配置時間間隔,單位有:milliseconds, seconds, minutes or hours,如上面的三十秒(數值跟單位中間空格隔開)。這里沒有指定單位的情況下默認單位是milliseconds。
PS:
1- 根據官方文檔,當scan設置為true,會自動添加一個過濾器,這個過濾器在logger線程中被調用。也就是說,當調用logger.debug(),這個方法執行前,會先調用過濾器的方法。假如這時logger的級別被設置成了info,那么logger.debug()任然會被調用。
2- 自動加載會影響性能。因此,所以在實現上,不是每次logger調用都會去判斷scanPeriod是否到期,默認情況是沒16次調用會去檢查一下scanPeriod是否到期。所以說這個重加載會有很小的延遲。(開發環境中可以忽略)
3、 針對特定用戶輸入debug級別的日志。
這里通過turboFilter來實現這個工具,如:在logback.xml中加入
<turboFilter class="com.ztgame.test.logback.SampleFilter">
<key>id=11,</key>
<OnMatch>ACCEPT</OnMatch>
<OnMismatch>NEUTRAL</OnMismatch>
</turboFilter>
SimpleFilter.java文件:
public class SampleFilter extends TurboFilter {
private String key;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
@Override
public FilterReply decide(Marker marker, Logger logger, Level level,
String format, Object[] params, Throwable t) {
if (format != null && format.contains(key)) {
return FilterReply.ACCEPT;
} else {
return FilterReply.DENY;
}
}
}
turboFilter是全局的,當logger的事件產生的時候就去做過濾。假如設置了logger的級別是info,上面的代碼能讓id為11的用戶信息打印出來。
注意: 1. 寫log的時候大家最好統一規范,潛規則是:
在什么【時間】,【人物】在【地點】做了【事件】【……】
【時間】:日志記錄的時間
【人物】:日志記錄的對象,如:userId=11
【地點】:輸入日志的方法
【事件】:具體做了什么,如:買了xxx
【……】:其他相關信息,如:rpc耗時等等
2. 單個信息后面加上固定分割符:如userId=11,(逗號)
4、 區分開發和生產環境
logback默認加載配置文件的優先級是:logback-test.xml > logback.xml。在開發和測試階段提供logback-test.xml來達到區分生產環境與開發環境的目的。
5、 為每個用戶生產一個日志文件
用SiftingAppender來實現
logback.xml
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<Key>userid</Key>
<DefaultValue>unknown</DefaultValue>
</discriminator>
<sift>
<appender
name="FILE-${userid}" class="ch.qos.logback.core.FileAppender">
<File>log/${userid}.log</File>
<Append>false</Append>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</Pattern>
</layout>
</appender>
</sift>
</appender>
Java文件:
logger.debug("Application started");
MDC.put("userid", "Alice");
logger.debug("Alice says hello");
MDC.put("userid", null);
logger.debug("Alice says hello2");
這里需要在每次記錄log之前設置用戶信息。(有點麻煩,可以簡單封裝一下,適合新項目)
6、log文件的壓縮和自動刪除
logback提供一套自動壓縮和刪除的機制,具體配置查看logback_demos中的示例。
建議是這樣一種日志布局:
|---------log根目錄
|-----------------動態log文件(當前被使用)
|-----------------backup目錄(用于存放日志備份)
….
|------------------------日期目錄(存放壓縮好的備份日志,,過期的會被自動刪除)
附件:
1. 附帶一些demos(eclipse項目) ,下載地址:logback_demos.zip
2. Logback官方中文手冊,下載地址:Logback手冊.pdf
posted on 2012-06-05 13:56
沖杯茶喝 閱讀(9231)
評論(0) 編輯 收藏