我将 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);
}
}
}
要解决此问题,您可以将记录器的日志记录级别更新为适当的级别,例如“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 的原因。