如何解决Log4j2要记录呼叫者的文件和行号
我有办法记录Is it possible to have clickable class names in console output in IntelliJ?上的文件路径和行号
但是由于某种原因,我必须在包装的类中调用与日志记录相关的方法(原因是我将一些自行开发的日志记录框架桥接到log4j2):
public class ILogAdapter extends CommonLogger {
@Override
public void info(String title,Throwable throwable) {
// this.logger = org.apache.logging.log4j.LogManager.getLogger(key);
logger.info(title,throwable);
}
现在,当我执行日志操作时,调用堆栈的顶层方法以及文件和行号始终是此方法的一部分,我是否可以更改此行为?
更新:
无论如何,我有一种方法来获取调用者的文件/行号,并将其放在mdc上下文中:
private void getLineAndFileOfCaller() {
threadcontext.clearall();
try {
throw new IllegalStateException();
} catch (Exception ex) {
final StackTraceElement[] stackTrace = ex.getStackTrace();
if(stackTrace.length > 3) {
final StackTraceElement stackTraceElement = stackTrace[stackTrace.length - 3];
threadcontext.put("file",Objects.toString(stackTraceElement.getFileName()));
threadcontext.put("line",Objects.toString(stackTraceElement.getLineNumber()));
}
}
}
然后我将桥接方法更改为:
@Override
public void debug(String title,String message) {
getLineAndFileOfCaller();
logger.debug(String.format("[%s] %s",title,message));
}
并将日志模式设置为:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="Console" target="SYstem_OUT">
<!--<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>-->
<!--<PatternLayout pattern="%-5p - [%-80m] - at %c.%M(%F:%L)%n"/>-->
<PatternLayout pattern="%(X{file}:%X{line}): %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
当我打电话给类似的东西
时ILogAdapter#debug(java.lang.String,java.lang.String)
我可以获取登录位置的文件和行号,但不能获取控制台中适配器的文件和行号。
我不知道这是否是更好的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。