日志未在日志文件中打印异常的完整堆栈跟踪

时间:2020-03-31 22:45:42

标签: spring-boot log4j2

我试图在我的日志文件中打印异常的整个堆栈跟踪,而不在代码中添加log.error语句,因为我必须在整个应用程序中进行此通用实现。任何人都可以帮忙,这是log4j2配置xml文件。

 <?xml version="1.0" encoding="UTF-8"?>
 <configuration status="WARN">
  <appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>

    <File name="MyFile" fileName="logs/app.log">
        <PatternLayout pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>             
  </appenders>

         <logger name="org.springframework" level="error" additivity="false">
            <AppenderRef ref="MyFile"/>
        </logger>
  <root level="INFO">
      <appender-ref ref="Console"/>

    </root>    

</configuration>

1 个答案:

答案 0 :(得分:0)

在不使用log.error语句的情况下,无法通过log4j2 xml配置将输出通过管道传输到日志文件。但是,有一种方法可以通过在一个地方集中处理异常而不是在代码中重复进行此操作来优化此方法。

编写一个单独的类,它将最终处理所有异常,您可以使用 @ExceptionHandler(Exception.class),它将处理所有异常,在这种情况下,您可以拦截异常并使用log.error(e)注销完整的堆栈跟踪。用@ControllerAdvice(<all_pckages_you_want_cover>)注释该类将确保每当引发未处理的异常时,它最终都会在此时被拦截并记录下来。

参考:https://dzone.com/articles/global-exception-handling-with-controlleradvice

PS:如果您要询问已处理的异常,无论如何都将对它们进行自定义处理,因此您可以在捕获块中添加一行以记录它们。