log4j 是怎么取到行号的

log4j 是怎么取到行号的

我使用的是 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...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值