Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j2:如何在不使用Throwable的情况下获取类名和行号?_Java_Logging_Log4j_Log4j2 - Fatal编程技术网

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

Java Log4j2:如何在不使用Throwable的情况下获取类名和行号?,java,logging,log4j,log4j2,Java,Logging,Log4j,Log4j2,我已经在Log4j2上开发了一个包装器类。使用OSGi的声明性服务,我使用自己的记录器接口发布了一个定制记录器服务,其中包装器类是实现。包装器类仅用于以编程方式配置记录器、设置消息格式和添加更多方法,最后调用Log4j2的日志方法 我想打印日志文件中请求的每个日志的源类/文件名和行号。选项%C/%F和%L仅打印有关包装器类中我实际调用log方法的位置的信息 因此,作为一项训练,我每次都将new Throwable作为参数传递,这样我就可以使用布局%Throwable{short.lineNumb

我已经在Log4j2上开发了一个包装器类。使用OSGi的声明性服务,我使用自己的记录器接口发布了一个定制记录器服务,其中包装器类是实现。包装器类仅用于以编程方式配置记录器、设置消息格式和添加更多方法,最后调用Log4j2的日志方法

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

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

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

有没有办法追踪到来电者?我希望有一个类似的解决方案,适用于您不希望在logger服务的每个使用者上都安装LOG4j2 JAR的应用程序。仅供参考,我不想使用任何XML文件,所有配置都是以编程方式进行的

您可以使用

StackTraceElement[] stes = Thread.currentThread().getStackTrace();
不过,我不确定这是否便宜得多


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

Log4j2在内部遍历堆栈跟踪以提取位置信息。通过为
org.apache.logging.log4j.spi.ExtendedLogger#logMessage
方法指定正确的FQCN(完全限定类名),它知道在堆栈跟踪中的何处停止

Log4j2包含一个为记录器包装器生成代码的工具。文档位于此处(在自定义日志级别手册页面中):


尝试使用此工具生成记录器包装,并根据生成的代码创建自定义包装。生成的代码将使用正确的FQCN,并能够生成正确的位置信息。

有趣的问题。也许看看log4j的源代码,看看他们是如何做到的。log4j还使用堆栈跟踪来识别这些信息。嗨,彼得,谢谢你的回答。我没有看到其他替代方案,因此我认为在每个日志上从包装器类调用堆栈跟踪可能是当前的解决方案(如果我正确理解您的答案)。由于项目需要,我需要线路号。但是Log4j2只接受一个消息参数,除了在要记录的消息中连接字符串之外,您对如何传递提取的信息有什么建议吗?