开启log4j的记录源代码行号的配置,会对系统性能产生影响

   今天看到一篇文章,谈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 http://weblogs.java.net/blog/zarar/archive/2005/11/sneaky_sneaky_l.html

===========================================================================
补遗篇~~~~~!

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

(文/Victor)

本文来源:http://www.blogjava.net/Victor/articles/23099.html


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。