2011-01-26

SLF4J 1.6.1 速成

  • SLF4J - Simple Logging Facade for Java
  • 與 Jakarta Commons Logging(JCL) 一樣,SLF4J 提供一個抽象層,讓系統可以在 deploy 時抽換像是 log4j 之類的 logging framewok。
  • "Hello World" example,得加入 slf4j-api-xxx.jar 與 slf4j-simple-xxx.jar 。
    Logger log = LoggerFactory.getLogger(this.getClass());
  • 一個讓人想要用 SLF4J 的功能 - placeholder。
    log.debug("{} records found in this area, {}", cnt, area);
  • SLF4J 裡的三種角色:
    • slf4j-api - slf4j core api
    • slf4j-log4j12 - slf4j logging binding
    • log4j - logging framework
    • 所以在 deploy 時要抽換的是 slf4j logging binding,而不是 logging framework。
    • 如果在執行時,slf4j 沒有找到 binding,那就自動進入 slf4j-nop binding 狀態。
    • 區分 binding 與 framework 的好處之一是,component 的 user 可以自行決定使用哪一種 framework 而加入哪一種 binding,所以 component 是可以不內建 binding 的。
  • SLF4J 提供以下的 logging framework binding,同時間在 class 或 lib path 裡只能有下面其中一種 binding。
    • slf4j-log4j12 -使用 log4j 1.2,需要另外加入 log4j 的 jar 檔。
    • slf4j-jdk14 - 使用 java.util.logging(JUL)。
    • slf4j-nop - 不用 logging,丟掉所有 log 訊息。
    • slf4j-simple - SLF4J 提供的簡易實做,只輸出 INFO 以上的訊息到 system.err。
    • slf4j-jcl - 將所有 log 訊息轉到 JCL
  • SLF4J 的呼叫流程
    • client code --> slf4j-api --> slf4j-log4j12 --> log4j
    • 非常簡單,沒有用到複雜的 class loader,所以不會有像 JCL 的 class loader 問題或者是 memory leak。
  • SLF4J Bridging
    • 將已經使用像是 log4j 等其他 logging framework 的既有系統轉換成使用 SLF4J。
    • 因為原來的 logging framework API 已經散佈整個系統,所以SLF4J Bridging 採用的方法是保留原 logging framework 的 interface,但將底層以 SLF4J 實做。
    • JCL
      • 原本流程:JCL API --> logging framework
      • 修改流程:JCL API --> SLF4J Impl. --> slf4j binding --> logging framework
      • 以 jcl-over-slf4j.jar 取代 commons-logging.jar,jcl-over-slf4j.jar 含有 JCL 的 interfaces,但是用 SLF4J 實做,有點冒名頂替的意味。
      • 可以立即解決 class loader 與 memory leak 的問題。
      • slf4j-jcl 是一種 binding,與 jcl-over-slf4j 大大地不同,使用 slf4j-jcl 的主要原因在於原系統不得不用 JCL,但卻想要使用 SLF4J 的介面,slf4j-jcl 的流程為 slf4j-api --> slf4j-jcl --> JCL,非常重要的一點是 slf4j-jcl 與 jcl-over-slf4j 不可以同時存在,因為前者是將 log 由 SLF4J 傳給 JCL,後者是將 log 由 JCL 傳給 SLF4J,同時存在會造成無窮迴圈。
    • log4j
      • 原本流程:log4j
      • 修改流程:log4j API --> SLF4J Impl. --> slf4j binding --> logging framework
      • 以 log4j-over-slf4j.jar 取代 log4jjar,log4j-over-slf4j.jar 含有大部分的 log4j library,但是用 SLF4J 實做。
      • 如果使用了上述大部分 log4j library 以外的 library,那麼 SLF4J 就幫不上忙了。
      • 如果 logging framework 還是用 log4j,那麼只會增加一點點的效能負擔;但是如果表層是 log4j,底層改用 logback 這類效能比 log4j 好的 logging framework 時,加上中介層 SLF4J 的好處就比較明顯了。
      • 和 JCL 一樣,slf4j-log4j12 不可以和 log4j-over-slf4j 並存。
    • JUL
      • 有人在用 JUL 嗎?跳過。
  • SLF4J 提供可以從其他 logging framework 快速轉換到 SLF4J 的 migrate tool

沒有留言:

張貼留言