Log4j2:如何在不使用Throwable的情况下获取类名和行号?

2022-04-12 00:00:00 logging java log4j log4j2

我在Log4j2上开发了一个包装类。通过使用OSGi的声明性服务,我使用自己的记录器接口发布了一个定制记录器服务,包装器类是其实现。包装类只是用来以编程方式配置记录器,消息格式化&;添加几个方法,最后调用Log4j2的记录方法。

我想打印日志文件中请求的每个日志的源类/文件名和行号。选项%C/%F和%L仅打印有关包装类中我实际调用log方法的位置的信息。

因此,作为练习,我每次都将new Throwable作为参数传递,这样我就可以使用布局%Throwable{Short.lineNumber}。但对于嵌入式应用程序来说,这是一个昂贵的过程。

我的主要问题是获取行号,因为对于文件名,我至少可以用请求记录器服务的每个服务的名称从Log4j2请求一个新的记录器,并将其保存在映射中。

有没有解决方案来追踪呼叫者?我希望有一个类似的应用程序解决方案,其中您不希望在记录器服务的每个使用者上都有LOG4j2JAR。仅供参考,我不想使用任何XML文件,所有配置都是以编程方式进行的。


解决方案

您可以使用

StackTraceElement[] stes = Thread.currentThread().getStackTrace();

不过,我不确定这个是否便宜。

我所做的是使每条消息都是唯一的(对于类),并避免包括行号。您可以在IDE中搜索唯一消息以找到行号。该类应该在记录器的名称中。

相关文章