我想将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则使用完整堆栈跟踪。我愿意接受替代方案的建议。
谢谢! :)
答案 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方法转换。
答案 3 :(得分:0)
对于log4j2,您可以编写一个简单的包装类或生成一个Webel建议的类。请参阅我对log4j2的回答: https://stackoverflow.com/a/39045963/116810