log4j 是怎么取到行号的
我使用的是 log4j_1.2.15,在其源代码上进行分析。
修改 examples 目录下的 MyPatternLayout.java
让其输出行号。
修改 org/apache/log4j/spi/LocationInfo.java
加入两个输出:
分析一下运行结果,很明显,发起一个异常,然后得到行号。
LocationInfo.java 里,主要有如下几个方法:
getClassName
getFileName
getLineNumber
getMethodName
除了行号,其它几个属性的获得,也应该是通过异常来得到的。这样,将极其耗费资源。
[b][color=red]
结论:要让 log4j 输出行号以及一些附属信息,要耗费很多资源的。一定要慎重使用。
[/color][/b]
附
运行结果:
我使用的是 log4j_1.2.15,在其源代码上进行分析。
修改 examples 目录下的 MyPatternLayout.java
//Layout layout = new MyPatternLayout("[counter=%.10#] - %m%n");
Layout layout = new MyPatternLayout("[counter=%.10#]%L - %m%n");
让其输出行号。
修改 org/apache/log4j/spi/LocationInfo.java
加入两个输出:
this.fullInfo = s.substring(ibegin, iend);//150 行左右
System.out.println("151 s:" + s);
System.out.println("152 fullInfo:" + fullInfo);
分析一下运行结果,很明显,发起一个异常,然后得到行号。
LocationInfo.java 里,主要有如下几个方法:
getClassName
getFileName
getLineNumber
getMethodName
除了行号,其它几个属性的获得,也应该是通过异常来得到的。这样,将极其耗费资源。
[b][color=red]
结论:要让 log4j 输出行号以及一些附属信息,要耗费很多资源的。一定要慎重使用。
[/color][/b]
附
运行结果:
151 s:java.lang.Throwable
at org.apache.log4j.spi.LoggingEvent.getLocationInformation(LoggingEvent.java:247)
at org.apache.log4j.helpers.PatternParser$LocationPatternConverter.convert(PatternParser.java:483)
at org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:65)
at org.apache.log4j.PatternLayout.format(PatternLayout.java:502)
at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:302)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:160)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
at org.apache.log4j.Category.callAppenders(Category.java:208)
at org.apache.log4j.Category.forcedLog(Category.java:396)
at org.apache.log4j.Category.debug(Category.java:263)
at examples.MyPatternLayout.main(MyPatternLayout.java:59)
152 fullInfo:examples.MyPatternLayout.main(MyPatternLayout.java:59)
[counter=1]59 - Hello, log
151 s:java.lang.Throwable
at org.apache.log4j.spi.LoggingEvent.getLocationInformation(LoggingEvent.java:247)
at org.apache.log4j.helpers.PatternParser$LocationPatternConverter.convert(PatternParser.java:483)
at org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:65)
at org.apache.log4j.PatternLayout.format(PatternLayout.java:502)
at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:302)
at org.apache.log4j.WriterAppender.append(WriterAppender.java:160)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66)
at org.apache.log4j.Category.callAppenders(Category.java:208)
at org.apache.log4j.Category.forcedLog(Category.java:396)
at org.apache.log4j.Category.info(Category.java:637)
at examples.MyPatternLayout.main(MyPatternLayout.java:60)
152 fullInfo:examples.MyPatternLayout.main(MyPatternLayout.java:60)
[counter=2]60 - Hello again...