我的Java记录器(比如logback)如何找到我的代码的行号?

时间:2014-01-23 11:28:00

标签: java logging slf4j logback

我的Java记录器(比如logback)如何找到我的代码的行号?

这是高性能系统中包含文件行号的性能问题吗?

是否需要抛出异常并分析堆栈跟踪才能执行此操作,还是需要另外一个技巧?

感谢

2 个答案:

答案 0 :(得分:4)

行号被编译到.class文件中,获取它们肯定比不这样做更有效。

你可以在不通过Thread#getStackTrace()抛出异常的情况下获得堆栈跟踪,但是它应该与创建异常的成本大致相同(你不需要抛出并捕获它)。

How Expensive is Thread.getStackTrace()?

中所述,收集信息可能非常昂贵

但单独过多的日志记录已经严重降低了系统的速度。

  

这是高性能系统中包含文件行号的性能问题吗?

你应该测试一下。如果它不是没有行号的性能问题,那么它可能没有问题。这一切都取决于您记录的位置和频率。


documentation还提到了行号

  

生成行号信息的速度不是特别快。因此,应该避免使用它,除非执行速度不是问题。

答案 1 :(得分:1)

  

我的Java记录器(比如logback)如何找到我的代码的行号?

您可以自己阅读代码。 available中的online various places

  

这是高性能系统中包含文件行号的性能问题吗?

是的,如果你做了很多logger.log调用(或等效的)。 Log4j和Logback的文档都说明了这一点。

  

是否需要抛出异常并分析堆栈跟踪才能执行此操作,还是需要另外一个技巧?

我的理解是,这是应用程序代码执行此操作的唯一实用方法。

(您可以假设重复使用现有的异常对象,并在每次想要捕获堆栈帧时调用fillInStackTrace()。但是,性能优势将是微乎其微的,特别是在您处理多线程问题之后。)