【问题标题】:How can I configure log4j to not print the exception stacktrace?如何配置 log4j 不打印异常堆栈跟踪?
【发布时间】:2010-09-25 19:16:16
【问题描述】:

我们使用 Log4j(和 Commons Logging)来记录我们的错误消息。现在我们想设置一个额外的日志附加器,将致命错误输出到 syslog,但没有异常长的 Java 堆栈跟踪(这些堆栈跟踪仍将在完整的日志文件中可用)。

如何配置它(使用 log4j.xml)?是否有过滤器可以忽略堆栈跟踪?

【问题讨论】:

  • 另一个可能需要此功能的用例是,当您运行一组包含负面测试的测试时,这些测试预计会引发我们一直希望在生产环境中登录的异常。我们不希望我们的测试日志中挤满了与课程相同的异常

标签: exception logging log4j


【解决方案1】:

您可能需要编写一个自定义布局来执行此操作(这样做还不错;您可以继承 PatternLayout)。

【讨论】:

    【解决方案2】:

    阅读更多源代码后进行编辑:

    你仍然需要继承 PatternLayout,但是你想要重写的方法是 ignoresThrowable():它应该返回 false,这将阻止 appender 编写 Throwable(它假设布局已经这样做了)。

    无法在配置中指定这一点:PatternLayout 有一个硬编码的“return true”。

    【讨论】:

    • 好的,可以,谢谢。太糟糕了,这不是 log4j 的配置选项。我想知道为什么它的处理方式与 PatternLayout 可用的其他选项有很大不同。对我来说似乎是一个自然的格式化选项......
    • 有点奇怪:当我第一次看代码时,我认为布局处理了所有事情,然后发现它实际上是附加器。并且附加程序略有不同。如果你打算这样做,你可以为 ignoreThroable() 添加一个设置器并提交一个补丁。
    【解决方案3】:

    如果您可以更改源代码,则可以考虑另一种选择。

    在我的应用程序中,我总是并且只记录来自我的应用程序入口点的致命消息(例如,“main()”),因为我只知道它们是致命的,如果我因为它们而退出应用程序。

    因此,在这个地方(或者如果您有多个应用程序入口点,则在少数地方),使用“syslog”或类似的特殊类或 MDC 实例化 Log4j Logger。在捕获一个即将成为致命错误时,以通常的方式记录它(对于您的其他日志文件等),但也要在这个新的“syslog”记录器上调用 fatal() 方法,只使用您的精确消息想要(例如只有异常类和消息但没有堆栈跟踪)。然后将 Log4j 配置为仅将这个“syslog”类或 MDC 定向到新配置的以 SysLog 为目标的 Appender。

    塔达姆!

    【讨论】:

      【解决方案4】:

      logback-classic(log4j 的继任者)中的“nopex”或“nopexception”转换词禁用打印堆栈跟踪。 “nopex”转换词与rest of conversion words 一起记录在案。您需要向下滚动一点。

      如果您需要有关此主题的更多信息,请联系 logback-user 邮件列表。

      【讨论】:

        【解决方案5】:

        这是我使用的实际代码:

        import org.apache.log4j.PatternLayout;
        
        public class NoStackTracePatterLayout extends PatternLayout {
        
         @Override
         public boolean ignoresThrowable(){
          return false;
         }
        }
        

        【讨论】:

        • 谢谢。再说一次,仅仅为此编写一个子类并不好。应该是 PatternLayout 上的一个配置选项。
        【解决方案6】:

        在 1.2.16 中您可以使用 EnhancedPatternLayout

        【讨论】:

        • 这对我很有帮助。谢谢。
        【解决方案7】:

        如果你使用 log4j > 1.2.16,你可以使用EnhancedPatternLayout 布局。

        示例(带有 log4j.properties 文件),将其定义为 appender 的布局,然后在转换模式中添加 %throwable{0}

        log4j.appender.XXX.layout=org.apache.log4j.EnhancedPatternLayout
        log4j.appender.XXX.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c:%L - %m%n%throwable{0}
        

        【讨论】:

        • 这正是我需要的,但是使用 slf4j 包装器 slf4j-log4j12 版本 1.7.12(在后台使用 log4j 版本 1.2.17)它仍然显示完整的 JSONException :( 有谁知道为什么吗?
        【解决方案8】:

        从 Log4j2 开始,您只需将 "%ex{0}" 添加到您的日志模式(假设您使用的是 PatternLayout)

        https://logging.apache.org/log4j/log4j-2.1/manual/layouts.html

        【讨论】:

          猜你喜欢
          • 2011-01-18
          • 1970-01-01
          • 1970-01-01
          • 2012-09-04
          • 2014-08-06
          • 2012-01-03
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多