隨筆-4  評論-10  文章-0  trackbacks-0

           

          Tuesday, June 05, 2012編寫
          2012年7月17日日更新

          如果是剛剛接觸logback,建議先下載本文最后的《Logback手冊.pdf》官方手冊閱讀。

          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 沖杯茶喝 閱讀(9234) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 龙游县| 三都| 宁国市| 林周县| 临城县| 高密市| 老河口市| 离岛区| 张掖市| 无极县| 吴堡县| 涟源市| 玉环县| 东乡族自治县| 清涧县| 岑溪市| 延庆县| 南召县| 朔州市| 新邵县| 霍城县| 沛县| 大竹县| 肃南| 牙克石市| 防城港市| 疏勒县| 晋州市| 铜山县| 灌南县| 平度市| 如东县| 沂南县| 东方市| 保康县| 金溪县| 开鲁县| 明星| 屯昌县| 禹城市| 云林县|