今天看到一篇文章,談Log4j對系統的效能的影響...整理如下:
一般,我們用log4j寫log的時候,很習慣于如下面記錄:
2005-01-11 09:57:57,816 DEBUG (BizProc.java:275) Begin to get connection... 2005-01-11 09:57:57,816 DEBUG (BizProc.java:275) Obtain connection 2345@defd 2005-01-11 09:57:57,816 DEBUG (BizProc.java:275) Begin transaction [TX_2015_RECV] processing... 2005-01-11 09:57:57,925 DEBUG (BizProc.java:328) All of the values were: |
這里會把Java Source Code中的行號帶出來,查找錯誤很方便...
但,這也是問題之所在...文章中介紹,Log4j之所以可以得到行號,是用了JVM的一個特性,不知道大家有沒有注意到,如果我們的Java程序在運行時出現錯誤,會出現下面的信息:
javax.naming.NamingException: Cannot create resource instance at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:189) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:301) at org.apache.naming.NamingContext.lookup(NamingContext.java:834) at org.apache.naming.NamingContext.lookup(NamingContext.java:181) at org.apache.naming.NamingContext.lookup(NamingContext.java:822) at org.apache.naming.NamingContext.lookup(NamingContext.java:181) at org.apache.naming.NamingContext.lookup(NamingContext.java:822) at org.apache.naming.NamingContext.lookup(NamingContext.java:181) at org.apache.naming.NamingContext.lookup(NamingContext.java:822) at org.apache.naming.NamingContext.lookup(NamingContext.java:194) at org.apache.naming.SelectorContext.lookup(SelectorContext.java:183) at javax.naming.InitialContext.lookup(InitialContext.java:347) |
看到黑體字沒有,原來JVM已經內嵌支持Debug出行號信息了!可是,這里是出錯的時候,JVM拋出的,那為什么用 log4j.info() 的時候,也可以看到行號呢?
下面就是重點,Log4j中記錄行號的過程...
(1) 調用了 log4j.info() 或是log4j.debug()方法... (2) 建立一個Throwable 的對象來取得當前運行堆棧的快照...Throwable.fillInStackTrace(); (3) 從拋出的Throwable對象中,來分析出當前log信息的行號...
|
但是,請注意,建立運行時的堆棧跟蹤,對JVM來說,是一項非常大的開銷!
所以,我們在配置log4j的PatternLayout的時候,如果是要上線到正式環境,一定要記者把參數關掉,
一般來說,用 “%d %-5p %m%n" 就可以滿足了!
原文請參考這里:
Sneaky, sneaky Log4J===========================================================================
補遺篇~~~~~!
log4j.rootLogger=info, Console
log4j.logger.net.csdn.blog.xport=debug, RollingFile
log4j.additivity.net.csdn.blog.xport=false
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d %-5p [%t] %C{1} - %m%n
log4j.appender.RollingFile=org.apache.log4j.RollingFileAppender
log4j.appender.RollingFile.File=SystemLog.log
log4j.appender.RollingFile.Append=true
log4j.appender.RollingFile.MaxFileSize=2MB
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d %-5p [%t] %C{1} - %m%n