在學(xué)校學(xué)習(xí)過(guò)程中,或者自己剛開(kāi)始編程時(shí),我經(jīng)常通過(guò)System.out來(lái)輸出各種結(jié)果。由于程序的規(guī)模很小,再者不是線上的應(yīng)用,所以這種方法簡(jiǎn)單、快捷有效。在學(xué)習(xí)Hadoop過(guò)程中,第一次接觸log4j,但是當(dāng)時(shí)并沒(méi)有在意這些細(xì)節(jié)。 工作后,遇到問(wèn)題或者調(diào)試時(shí)會(huì)通過(guò)日志來(lái)看程序的運(yùn)行狀態(tài),尤其是把error stack輸出后,能夠很快的定位問(wèn)題,對(duì)于解決問(wèn)題起到很大的作用。 這篇文章,通過(guò)“為什么使用 SLF4J 而不是 Log4J 來(lái)做 Java 日志 ”這樣的問(wèn)題來(lái)帶入,再通過(guò)slf4+log4j來(lái)實(shí)踐日志配置。其他的日志記錄庫(kù),如java.util.logging、logback等,待有時(shí)間在進(jìn)行學(xué)習(xí)和總結(jié)。

(1) 應(yīng)用層使用slf4j-api作為日志接入的接口; (2) 編譯時(shí),slf4j-api中public final class LoggerFactory類中 PRivate final static void bind()方法會(huì)尋找具體的日志實(shí)現(xiàn)類綁定,主要通過(guò) StaticLoggerBinder.getSingleton() 語(yǔ)句調(diào)用。 (3) slf4j-log4j12 是連接slf4j-api 和log4j的中間適配器,它實(shí)現(xiàn)了slf4j-api中StaticLoggerBinder接口,從而使得在編譯時(shí)綁定的是slf4j-log4j12的getSingleton()方法。 (4) log4j是具體的日志系統(tǒng),通過(guò)slf4j-log4j12初始化log4j,達(dá)到最終日志輸出。
在使用log4j時(shí),由于java沒(méi)有那么方便的文檔級(jí)別的預(yù)編譯方法,如下的代碼是不是很無(wú)聊?
if (logger.isDebugEnabled()) {    logger.debug("Processing trade with id: " + id + " symbol: " + symbol);}    而使用slf4j,可以更簡(jiǎn)潔的達(dá)到同樣的效果,提高代碼的可讀性。
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);下面的SLF4J日志方法的代碼,來(lái)自于slf4j-log4j12-1.6.1.jar包里的Log4j的適配器類Log4jLoggerAdapter.
public void debug(String format, Object arg1, Object arg2) { if (logger.isDebugEnabled()) {      FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);      logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());    }}3. slf4j + log4j來(lái)做日志
(1) 引用
    通過(guò)上面的介紹,除了引用slf4j之外,還需要作為適配器的slf4j-log4j12和具體實(shí)現(xiàn)的log4j的jar包。具體版本需要看使用的log4j版本和slf4j版本。    如果通過(guò)Maven來(lái)管理項(xiàng)目依賴,那就簡(jiǎn)單多了,只需要在pom文件中引用slf4j-log4j12的后,編譯時(shí)會(huì)自動(dòng)引入它所依賴的其他jar包。    <dependency>        <groupId>org.slf4j</groupId>        <artifactId>slf4j-log4j12</artifactId>        <version>1.6.1</version>    </dependency> (2) log4j的配置
 log4j可以通過(guò)程序代碼配置,也可以通過(guò)配置文件配置,顯然配置文件的方式更加靈活。   log4j支持兩種配置文件格式,一種是xml格式的文件,一種是java properties(key=value)。配置文件需要放置在classpath路徑下,而且XML文件的優(yōu)先級(jí)更高。    key/value形式的更有助于說(shuō)明,這里使用properties文件作為例子介紹log4j的配置。    a. 配置根Logger:         log4j.rootLogger = [ level ] , appenderName, appenderName, …        其中l(wèi)evel是日志記錄的優(yōu)先級(jí),appenderName是定義的Appenders,可以指定多個(gè)輸出目的地。    b. 配置Appender:log4j.appender.appenderName = fully.qualified.name.of.appender.classlog4j.appender.appenderName.option1 = value1…log4j.appender.appenderName.option = valueN        Appender常用屬性:        Threshold=WARN        - 指定日志級(jí)別        ImmediateFlush=true   - 默認(rèn)true,立即輸出        Target=System.err    -  默認(rèn)情況下是:System.out,指定輸出控制臺(tái)        File=mylog.txt              - 指定消息輸出到mylog.txt文件        Append=false              - 默認(rèn)true,指定是否追加        MaxFileSize=100KB    - 后綴可以是KB, MB 或者是 GB,指定日志文件的大小,到達(dá)時(shí),將會(huì)自動(dòng)滾動(dòng),原來(lái)的內(nèi)容放置到mylog.log.1文件中        MaxBackupIndex=2       - 指定滾動(dòng)文件的最大值        DatePattern='.yyyy-ww'  - 每周滾動(dòng)一次。            1)'.'yyyy-MM: 每月            2)'.'yyyy-ww: 每周             3)'.'yyyy-MM-dd: 每天            4)'.'yyyy-MM-dd-a: 每天兩次            5)'.'yyyy-MM-dd-HH: 每小時(shí)            6)'.'yyyy-MM-dd-HH-mm: 每分鐘            c. 配置Layout:    Layout是和Appender綁定的,不同的Appender可以有不同的輸出格式     log4j.appender.appenderName.layout = fully.qualified.name.of.layout.classlog4j.appender.appenderName.layout.option1 = value1…log4j.appender.appenderName.layout.option = valueN    當(dāng)使用org.apache.log4j.PatternLayout來(lái)自定義信息格式時(shí),可以使用 log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p -%m%n 來(lái)格式化信息     %c 輸出所屬類的全名,可寫為 %c{Num} ,Num類名輸出的范圍 如:"com.sun.aaa.classB", %C{2}將使日志輸出輸出范圍為:aaa.classB     %d 輸出日志時(shí)間其格式為 可指定格式 如 %d{HH:mm:ss}等     %l 輸出日志事件發(fā)生位置,包括類目名、發(fā)生線程,在代碼中的行數(shù)     %n 換行符     %m 輸出代碼指定信息,如info(“message”),輸出message     %p 輸出日志的優(yōu)先級(jí),即 FATAL ,ERROR 等     %r 輸出從啟動(dòng)到顯示該條日志信息所耗費(fèi)的時(shí)間(毫秒數(shù))     %t 輸出產(chǎn)生該日志事件的線程名[%-5p %d{yyyy-MM-dd HH:mm:ss.SSS}] [%t] %l [%m]%n是我們使用的日志格式。    對(duì)于xml的配置,通過(guò)引用和參考的形式給出,    http://www.cnblogs.com/kevin-yuan/archive/2012/11/23/2784610.html    https://www.mkyong.com/logging/log4j-xml-example/引用和參考http://woshixy.blog.51cto.com/5637578/1371420https://www.oschina.net/translate/why-use-sl4j-over-log4j-for-logginghttp://blog.csdn.net/yycdaizi/article/details/8276265//配置https://my.oschina.net/exit/blog/182445https://www.mkyong.com/logging/log4j-xml-example/http://www.cnblogs.com/ITEagle/archive/2010/04/23/1718365.html
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注