java Log4j未记录完整堆栈跟踪

niwlg2el  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(152)

我正在使用SLF4j和Log4j2。SLF4j版本是1.7.22,Log4j2版本是2.8.2。当我在一个方法中使用Log4j2记录一个异常时,它只记录一行。我期望日志显示日志中异常的完整堆栈跟踪。由于这个问题,我无法确定NullPointerException的原因。
下面是我的代码片段:

try{
    // Some code
}catch (Throwable e){
    logger.error("Occur exception -> ", e);
}

日志文件只有一行。

java.lang.NullPointerException: null

我的log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration packages="com.changing" >
    <Appenders>

        <!-- DailyFile & Log file Name format by pattern -->
        <RollingFile name="DailyFile"
            fileName="C:/logs/log.log"
            filePattern="C:/logs/log-%d{yyyyMMdd}.log">
            <PatternLayout charset="UTF-8"
                pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%t] %c{2}:%L - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.contoso" level="debug">
            <AppenderRef ref="DailyFile" />
        </Logger>
    </Loggers>
</Configuration>

我已经检查了这段代码在我的环境和测试环境中正确地写入了完整的堆栈跟踪。但是,当相同的代码在生产环境中运行时,它只显示一行。
如果我手动抛出异常,即使在生产环境中,它也会记录完整的堆栈跟踪。但是,当发生NullPointerException时,它只记录一行。
我已经检查了log4j2.xml文件在测试环境和生产环境中是相同的,只是文件路径不同。
我还测试了在同一个类的不同方法中抛出异常,即使在生产环境中也能显示完整的堆栈跟踪。方法A只显示了完整堆栈跟踪的一行,而方法B显示了完整堆栈跟踪。

class A {
    private static Logger logger = LogManager.getLogger(A.class);
    void methodA(){
        try{
           // Some code
        }catch (Throwable e){
            logger.error("Occur exception -> ", e);
        }
    }
    void methodB(){
        try{
           // Some code
        }catch (Throwable e){
            logger.error("Occur exception -> ", e);
        }
    }  
}
kxxlusnw

kxxlusnw1#

要修复此问题,您可以将日志记录器的日志记录级别更新为适当的级别,例如“DEBUG”或“TRACE”,以确保异常完全记录在日志文件中。您还可以修改日志记录器语句以显式地包含异常的堆栈跟踪。
下面是一个示例,说明如何修改日志记录器语句以包含异常的完整堆栈跟踪:

try {
    // Some code
} catch (Throwable e) {
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    logger.error("Occur exception -> " + sw.toString());
}

这将在日志文件中打印异常的完整堆栈跟踪,这可以帮助您识别NullPointerException的原因。

相关问题