间接调用log4j的日志方法(来自辅助方法)

时间:2014-05-27 02:08:01

标签: java log4j

我想将logger.debug(...)调用放入帮助器方法,并从需要编写日志的任何地方调用该帮助器方法。虽然这大部分工作正常,但日志条目本身将帮助器方法显示为调用源,这是可以理解的,因为log4j并不知道我使用辅助方法进行日志记录。

有没有办法告诉它在找出logger.debug(...)调用的来源时跳过辅助方法,而是使用它的调用者?

按来源,我的意思是org.apache.log4j.PatternLayout的%F:%L https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

为了说明我的意思,这是一个示例堆栈跟踪:

1. logger.debug(msg, throwable)
2. logHelper(logger, msg, throwable) <-- currently shows as the source of the call, since it calls logger.debug directly
3. someFunction <-- where the real logable event occurs, so I'd want this to be logged as the source

我这样做的原因是因为如果日志级别是INFO,我只想按名称(e.toString)记录异常,或者如果级别是DEBUG则使用完整堆栈跟踪。我愿意接受替代方案的建议。

谢谢! :)

4 个答案:

答案 0 :(得分:0)

您无法指示Log4J在其源检测中“跳过”某个级别。

但是,你可以做的是子类PatternLayout,并根据自己的喜好覆盖format(LoggingEvent)方法(即只在toString()模式下生成异常INFO等)。

答案 1 :(得分:0)

执行此操作的一种方法是调用辅助类:

logger.log(LogHelper.class.getName(), Level.DEBUG, message, t);

...而不是:

logger.debug(message, t);

因此,当log4j尝试确定事件的来源时,它会在到达LogHelper的父节点而不是Logger的父节点时停止。

验证按预期工作。

答案 2 :(得分:0)

对于Log4j2,答案完全由使用logger包装器提供,如Example Usage of a Generated Logger Wrapper下的Log4j2手册中所述。可以简单地生成(使用那里所示的org.apache.logging.log4j.core.tools.Generate $ ExtendedLogger工具)具有单个STUB级别的记录器包装器,然后调整它以创建模仿logIfEnabled使用的自定义日志记录方法(FQCN,LEVEL,Marker,message,Throwable) - 可能忽略STUB级别并使用常规级别 - 然后根据需要删除或注释掉STUB级别及其方法)。为此,FormattedMessage可能会有所帮助。

然后,通过使用配置中给出的PatternLayout中的%l位置转换模式元素,或者更具体地使用方法和源代码行,可以很容易地将方法和源代码行显示为完整位置信息的一部分。 %L行号和/或%M方法转换。

现在有完整的例子:Java Logging: Log4j Version2.x: show the method of an end-client caller (not an intermediate logging helper method)

答案 3 :(得分:0)

对于log4j2,您可以编写一个简单的包装类或生成一个Webel建议的类。请参阅我对log4j2的回答: https://stackoverflow.com/a/39045963/116810