我们使用Log4j(和Commons Logging)来记录我们的错误消息。现在我们要设置一个额外的日志追加器,将致命错误输出到syslog,但没有特别长的Java堆栈跟踪(这些仍然可以在完整的日志文件中使用)。
如何配置它(使用log4j.xml)?是否有可用于忽略堆栈跟踪的过滤器?
答案 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。
钽达姆!