隨筆 - 22, 文章 - 0, 評論 - 1, 引用 - 0
          數據加載中……

          slf4j筆記

          特性:
          classes are loaded by the JVM
          slf4j不需要classloader的原理(而common-logging需要classloader,所以會內存泄漏或者別的加載問題)
          Mapped Diagnostic Context (MDC)只有log4j和logback支持,slf4j也支持
          支持自定義日志級別(Marker),目前只有logback對其進行了實現。
          支持國際化(個人認為:有毛用啊……)
          -----------------------------------------------------------
          用法:
          log性能:
          以下這種形式,不管是否log,都會損失拼接字符串的時間:
          logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
          以下這種形式,是對上述情況的改進,但很臃腫:
          if(logger.isDebugEnabled()) {
            logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
          }
          以下這種,在slf4j里支持,很完美:
          logger.debug("The entry is {}.", entry);
          多個參數的情況:
          logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);
          很多參數的情況(也可以利用Object...,不用顯式指定Object[]):
          logger.debug("Value {} was inserted between {} and {}.", new Object[] {newVal, below, above});

          對{}進行轉義:
          以下情況不需要轉移(slf4j它只認緊挨著的{}符號)
          logger.debug("Set {1,2} differs from {}", "3");
          以下情況也不需要轉義:
          logger.debug("Set {1,2} differs from {{}}", "3");
          實在需要轉義時可以這樣:
          logger.debug("Set \\{} differs from {}", "3");
          實在不需要轉義時可以這樣:
          logger.debug("File name is C:\\\\{}.", "file.zip");
          打印異常對象的堆棧信息,除了這種形式:
          debug(String msg, Throwable t);
          還可以結合參數化(轉移字符{})來使用:
          logger.error("Failed to format {}", s, e);
               ——框架會發現最后一個參數是多余的,并查看其是否是一個異常對象,如果是則輸出堆棧,否則忽略。
          -----------------------------------------------------------
          logger聲明的討論:
          static和non-static各有好處:
               static的CPU和內存性能更好
               non-static對IOC更友好,而且在多個應用共用一套類庫時,可以保持各自的日志環境
                    (logback無論如何都是安全的,但如果在多個應用分享同一個類庫,并且為static的,那log4j會出問題:所有的日志都打印到第一個加載到內存的日志對象中)
               在slf4j的1.5.3之后,non-static的logger不需要標記transient關鍵字,也不會被序列化(怎么做到的?)
          建議的聲明方式(我覺得加上static比較好,還有private):
          final (static) Logger logger = LoggerFactory.getLogger(MyClass.class);
          -----------------------------------------------------------
          遷移工具:
          -----------------------------------------------------------
          實現包:
          唯一必要的包:slf4j-api.jar
          slf4j-log4j12-1.6.4.jar
               Binding for log4j version 1.2, a widely used logging framework. You also need to place log4j.jar on your class path.
               需要把log4j的包也一同放進來。
          slf4j-jdk14-1.6.4.jar
               Binding for java.util.logging, also referred to as JDK 1.4 logging
               綁定到jdk的日志中
          slf4j-nop-1.6.4.jar
               Binding for NOP, silently discarding all logging.
               綁定到“無操作”,靜默。
          slf4j-simple-1.6.4.jar
               Binding for Simple implementation, which outputs all events to System.err. Only messages of level INFO and higher are printed. This binding may be useful in the context of small applications.
               最簡單的實現,直接輸出到控制臺
          slf4j-jcl-1.6.4.jar
               Binding for Jakarta Commons Logging. This binding will delegate all SLF4J logging to JCL.
               綁定到common-logging,橋接過去。
          logback-classic-1.0.13.jar (requires logback-core-1.0.13.jar)
                綁定到原生實現的logback上,性能最高


          在maven中聲明包的實現:
          對于普通項目(并不是一個工具包):
               logback:
                    聲明對logback-classic-1.0.13.jar的依賴即可,會自動關聯依賴slf4j-api-1.7.7.jar和logback-core-1.0.13.jar(顯式聲明這兩個關聯依賴也可以)
               log4j:
                    聲明對slf4j-log4j12-1.7.7.jar的依賴即可,會自動關聯依賴slf4j-api-1.7.7.jar和log4j-1.2.17.jar
               jdk log:
                    聲明對slf4j-jdk14-1.7.7.jar的依賴即可,會自動關聯依賴slf4j-api-1.7.7.jar
          對于工具包項目:
               僅僅依賴slf4j-api即可,讓用戶自己決定底層用什么實現。
          二進制兼容性:
               各個api綁定包,與下面的日志實現包,其版本必須對應。比如slf4j-api-1.7.7.jar應該對應slf4j-simple-1.7.7.jar.
               而上層的應用程序,與其依賴的slf4j-api是各個版本都完全兼容的。
          支持MDC,同時需要底層的日志包也支持,例如logback或者log4j。
          -----------------------------------------------------------
          橋接包:
          1,從Jakarta Commons Logging (JCL)遷移到slf4j: 用“jcl-over-slf4j.jar”替換掉“commons-logging.jar”即可
               如果在maven中:1,明確的標記exclusion掉common-logging.jar。2,聲明common-logging.jar的依賴范圍為“provided”(在IED里顯示不太好,注意順序)。
          2,很少見的特殊情況,想要把slf4j日志轉移到JCL上:用slf4j-jcl.jar包
               ——上述兩個包不能一起用,否則死循環(這很好理解)
          3,從log4j遷移到slf4j(居然直接針對log4j編碼,太2了):用“log4j-over-slf4j.jar”替換掉“log4j.jar”即可。
               ——上述包不能與“slf4j-log4j12.jar”一起用,否則死循環(一樣的道理)。
          4,從java.util.logging(JUL)遷移到slf4j——jvm自己的類不允許隨便替換,所以這里比較復雜(SLF4JBridgeHandler+jul-to-slf4j.jar),而且有性能問題,很少用到,用的時候再研究。
                ——上述包不能與“slf4j-jdk14.jar”一起用,否則死循環(一樣的道理)。







          posted on 2014-07-13 18:49 王星游 閱讀(11446) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 祁连县| 文山县| 宝坻区| 南宫市| 准格尔旗| 赤壁市| 文山县| 临洮县| 临沧市| 东阳市| 永清县| 乐业县| 杭锦后旗| 百色市| 吉林省| 南岸区| 新营市| 阳泉市| 奉贤区| 资兴市| 个旧市| 张掖市| 新源县| 武威市| 大名县| 出国| 大连市| 丹东市| 香河县| 土默特左旗| 理塘县| 隆回县| 平度市| 苏尼特右旗| 永嘉县| 轮台县| 大邑县| 黄石市| 游戏| 宁化县| 阿图什市|