【问题标题】:Logger prints only the log message and not the exceptionLogger 只打印日志消息而不是异常
【发布时间】:2019-10-12 23:26:25
【问题描述】:
try {
   // some code
}
catch (Exception e) {
   Logger.log(Level.WARN, "Unable to complete the job. ID: " + id, e);
}

因此,显然开发人员希望如果出现问题,它会记录异常(异常类型和堆栈跟踪)

这是我得到的日志打印

[27 May 2019 13:30:07][http-nio-8080-exec-13][WARN]: Unable to complete the job. ID: 123457890

这里是 Log4j 配置

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=debug.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d{dd MMM yyyy HH:mm:ss}][%t][%p]: %m%n

我知道获取异常详细信息的方法,我想了解这种行为。这是怎么发生的?记录器是否忽略传递的参数?

【问题讨论】:

  • 试试Level.ERROR,因为WARN可能不会自动记录异常堆栈跟踪等
  • 尝试 Logger.error() 获取异常。
  • @GamingFelix 你知道 log4j 是如何工作的吗?查看logging.apache.org/log4j/2.0/log4j-api/apidocs/org/apache/… 如果堆栈跟踪采用您的日志记录格式,并且您将异常作为最后一个参数传递,则它应该打印出堆栈跟踪。如果您使用的是日志库,则永远不要自己调用 e.stacktrace - 日志库决定是否显示堆栈跟踪。
  • 查看日志格式/模式,确保您没有抑制堆栈跟踪。见:stackoverflow.com/questions/37206067/…
  • 啊,是的,我知道它是如何工作的。我没有看到它是 log4j,我自己以前也遇到过这个问题。你是对的,它是关于当你发送它时异常是什么参数:)这可能是他的问题。也许它实际上并不意味着是最后一个论点。但我真的没有看到它说它在任何地方都是 log4j

标签: java exception logging log4j


【解决方案1】:

ERROR 级别用于在日志文件中记录错误的堆栈跟踪。

尝试使用。

    try {
        // some code
    } catch (Exception e) {
       Logger.log(Level.ERROR, "Unable to complete the job. ID: " + id, e);
    }

如果仍然无法正常工作,请分享您的日志库。会检查的。

【讨论】:

    【解决方案2】:

    我唯一的猜测是,这是由于 热点优化

    服务器 VM 中的编译器现在为所有“冷”内置异常提供正确的堆栈回溯。出于性能目的,当此类异常被抛出几次时,可能会重新编译该方法。重新编译后,编译器可能会使用不提供堆栈跟踪的预分配异常来选择更快的策略。要完全禁用预分配的异常,请使用这个新标志:-XX:-OmitStackTraceInFastThrow。

    这是从这个答案中借用的一个相关问题:

    log4j not printing the stacktrace for exceptions

    【讨论】:

    • 我知道这个优化。这里的问题是它甚至不打印异常类型(类名如 NPE)
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多