如何配置log4j以不打印异常堆栈跟踪?

时间:2008-12-08 03:11:16

标签: exception logging log4j

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

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

8 个答案:

答案 0 :(得分:15)

阅读更多来源后编辑:

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

无法在配置中指定:PatternLayout具有硬编码“return true”。

答案 1 :(得分:9)

这是我使用的实际代码:

import org.apache.log4j.PatternLayout;

public class NoStackTracePatterLayout extends PatternLayout {

 @Override
 public boolean ignoresThrowable(){
  return false;
 }
}

答案 2 :(得分:6)

如果您使用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}

答案 3 :(得分:5)

在1.2.16中,您可以使用EnhancedPatternLayout

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

您可能需要编写一个自定义布局来执行此操作(这不是那么糟糕;您可以继承PatternLayout)。

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

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

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

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

钽达姆!