微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Log4j2要记录呼叫者的文件和行号

如何解决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 举报,一经查实,本站将立刻删除。