我的Java记录器(比如logback)如何找到我的代码的行号?
这是高性能系统中包含文件行号的性能问题吗?
是否需要抛出异常并分析堆栈跟踪才能执行此操作,还是需要另外一个技巧?
感谢
答案 0 :(得分:4)
行号被编译到.class
文件中,获取它们肯定比不这样做更有效。
你可以在不通过Thread#getStackTrace()
抛出异常的情况下获得堆栈跟踪,但是它应该与创建异常的成本大致相同(你不需要抛出并捕获它)。
如How Expensive is Thread.getStackTrace()?
中所述,收集信息可能非常昂贵但单独过多的日志记录已经严重降低了系统的速度。
这是高性能系统中包含文件行号的性能问题吗?
你应该测试一下。如果它不是没有行号的性能问题,那么它可能没有问题。这一切都取决于您记录的位置和频率。
documentation还提到了行号
生成行号信息的速度不是特别快。因此,应该避免使用它,除非执行速度不是问题。
答案 1 :(得分:1)
我的Java记录器(比如logback)如何找到我的代码的行号?
您可以自己阅读代码。 available中的online various places。
这是高性能系统中包含文件行号的性能问题吗?
是的,如果你做了很多logger.log调用(或等效的)。 Log4j和Logback的文档都说明了这一点。
是否需要抛出异常并分析堆栈跟踪才能执行此操作,还是需要另外一个技巧?
我的理解是,这是应用程序代码执行此操作的唯一实用方法。
(您可以假设重复使用现有的异常对象,并在每次想要捕获堆栈帧时调用fillInStackTrace()
。但是,性能优势将是微乎其微的,特别是在您处理多线程问题之后。)