2015-05-14 48 views
3

記錄我已經實現了由幾個班的算法框架。對於日誌記錄,我使用slf4j和logback。所以我的許多課程都有這樣的代碼:如何處理在生產代碼(的logback/SLF4J)

protected final Logger logger = LoggerFactory.getLogger(Myclass.class); 
... 
logger.debug("Some debug information"); 

現在我想打包我的代碼並使其生產就緒。我如何處理日誌代碼?

  1. 運行代碼時,開發人員通常會因性能原因關閉日誌記錄。
  2. 在開發代碼的調試信息是非常有用的,這樣刪除所有調試語句將是一個壞主意。

所以理想用戶應該能夠啓用/禁用日誌記錄。我通常有一個logback.xml配置文件,它在每個類的基礎上指定日誌級別。我應該在包中包含這樣一個文件嗎?或者我應該期望用戶自己編寫或提供默認配置文件?

我有代碼來配置所述算法:

/** 
* Read algorithm confirguration from properties file 
**/  
protected Configuration(Properties properties){...} 

該函數讀取屬性文件並相應地設置了一些算法參數。這可以用來啓用/禁用各種類的日誌記錄嗎?

回答

3

SLF4J和的logback很少有表現的影響,如果登錄到已關閉的水平。我從來沒有遇到過將日誌代碼放入的問題。它還具有能夠在生產環境中打開調試日誌以獲得關於偶發事件問題的更多信息的額外好處。

既然你創建一個類的記錄器,你可以簡單地配置這些記錄儀不具有一個appender,如果你不想從你的框架的任何輸出記錄。或者將級別設置爲您在高效環境中適應的值 - 只需記住關閉可加性,以便事件不會傳播到根記錄器。這裏描述的語法如下:http://logback.qos.ch/manual/configuration.html#syntax

另一個簡單的想法,使您的用戶可以通過輕鬆切換關閉從框架中的日誌記錄,是使用帶有適當過濾器的標記。你可以改變所有你的日誌調用開始一個標記:

private Marker MY_MARKER = MarkerFactory.getMarker("FrameworkMarker"); 

logger.debug(MY_MARKER, "Some debug information"); 

這允許你禁止標有與應用程序中的logback.xml定義的單個TurboFilter此特定標記的所有日誌輸出:

http://logback.qos.ch/manual/filters.html#TurboFilter

<turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter"> 
    <Marker>FrameworkMarker</Marker> 
    <OnMatch>DENY</OnMatch> 
</turboFilter> 

MarkerFilter具有不關心關卡的額外好處。任何具有指定標記的記錄事件都會被過濾掉(並且以一種有效的方式,如文檔中所述)。

就個人而言,我會去的兩個。通過這種方式,您可以在框架中使用所有日誌記錄級別,並根據需要通過MarkerFilter完全停用日誌記錄,但是在需要時還可以享受詳細和特定於級別的日誌記錄的好處。

+0

太棒了!關於你的第一個建議:我需要使用需要在類路徑中的logback.xml配置文件。你會推薦將這個文件包含到包含框架的jar包中,還是將這個文件作爲外部文件提供給使用該框架的用戶?我認爲最好將它作爲外部文件提供,以便用戶可以對其進行編輯並打開/關閉單個類的日誌記錄? –

+0

千萬不要*將你的logback.xml放入部署文件中。諸如這些配置應該是可修改的而不觸及部署,同樣重要的是完全由最終用戶決定。如果你正在提供一個框架來使用,我甚至會提供一個日誌記錄配置的片段,它也可以很好地與include的logback-configuration機制一起工作:http://logback.qos.ch /manual/configuration.html#fileInclusion通過這種方式,您可以爲最終用戶完全控制和靈活地配置日誌記錄。 – sheltem

+0

畢竟,應該記住,沒有不平凡的應用程序只使用*一個*框架。最好的方法是始終假定你的用戶也使用其他用戶,並確保你的框架足夠靈活以便與其他人一起工作,而不是以某種方式指定某種東西。 – sheltem

1

可以轉的logback OFF在運行時通過調用:

logger.setLevel(Level.OFF); 

這將關閉呼叫記錄所有級別(TRACE,DEBUG,INFO WARN,ERROR將被關閉)

的logback手冊指出:

記錄性能日誌記錄時被完全關閉

可以通過將根記錄器的根級別設置爲Level.OFF(最高可能級別)完全關閉日誌記錄。當日志記錄爲 完全關閉時,日誌請求的開銷包括方法 調用加上整數比較。在3.2Ghz Pentium D機器 上,此成本通常約爲20納秒。

瞭解更多關於這個在Logback manual architechture page

高級:一個好的做法將是有gradle這個設定根據生成類型的構建級別。開發或生產等(設置運行時間代碼可以稍後閱讀的變量)