簡體   English   中英

Log4j 通用自定義接口

[英]Log4j common custom interface

我正在使用 slf4j 和 log4j2,我想創建一個通用攔截器。 像下面這樣,如果將來出現任何 log4j 升級,我就不必更改每個 class。請查看下面的代碼,讓我知道您對性能和 memory 的想法。我們還有其他更好的方法可以做到這一點嗎?

Class LoggingHelper {

    public static void logEvent(Class clazz, String message, Object ...args) {
      Logger logger = LoggerFactory.getLogger(clazz);
       logger.info(message,args);
    
    }

}

保護用戶免受底層實現的更改正是SLF4J 或 Log4j2 API(參見API 分離)等 API 的目的。 盡管 API 中的語義主要版本提升可以破壞消費者代碼,但從未發生過此類更改:例如,最近的 SLF4J 2.x 版本在語義上是次要版本提升,只需要更新實現。

使用像你提議的那樣的 API 包裝器通常不是一個主意,因為你必須重新實現 API 已經處理的很多細節。 在你的例子中:

  • 實例化記錄器是一項昂貴的操作,這就是為什么記錄器幾乎總是 static 字段或在服務的構造函數中實例化(參見Static 與非靜態記錄器),
  • 您的包裝器破壞了位置信息:所有日志似乎都是由LoggingHelper生成的,
  • 你的包裝器總是創建一個臨時的可變參數數組,然后必須由 GC 收集。 日志記錄 API 不會為最常見的情況創建臨時對象:SLF4J 最多支持2 個非可變參數,Log4j2 API 最多支持10 個非可變參數(參見garbage-free logging )。

軟件系統傾向於放棄它們的自定義日志記錄 API:例如,Jetty 在 10.x 版本中放棄了其自定義日志記錄 API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM