我们使用 Log4j(和 Commons Logging)来记录我们的错误消息。现在我们要设置一个额外的日志附加器,它将致命错误输出到 syslog,但没有异常长的 Java 堆栈跟踪(这些堆栈跟踪仍将在完整的日志文件中可用)。
如何配置它(使用 log4j.xml)?是否有可用于忽略堆栈跟踪的过滤器?
阅读更多源代码后进行编辑:
您仍然需要继承 PatternLayout,但您要覆盖的方法是 ignoresThrowable():它应该返回 false,这将阻止 appender 编写 Throwable(它假定布局已经这样做了)。
无法在配置中指定这一点:PatternLayout 有一个硬编码的“return true”。
这是我使用的实际代码:
import org.apache.log4j.PatternLayout;
public class NoStackTracePatterLayout extends PatternLayout {
@Override
public boolean ignoresThrowable(){
return false;
}
}
如果您使用 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}
在 1.2.16 中,您可以使用 EnhancedPatternLayout
从 Log4j2 开始,您只需添加"%ex{0}"
到您的日志模式(假设您使用的是 PatternLayout)
https://logging.apache.org/log4j/log4j-2.1/manual/layouts.html
logback-classic(log4j 的继任者)中的“nopex”或“nopexception”转换词禁用打印堆栈跟踪。“nopex”转换词与其他转换词一起记录在案。您需要向下滚动一点。
如果您需要有关此主题的更多信息,请联系 logback-user 邮件列表。
您可能需要编写自定义布局来执行此操作(这还不错;您可以继承 PatternLayout)。
如果您可以更改源代码,则可以考虑另一种选择。
在我的应用程序中,我总是并且只记录来自我的应用程序入口点的 FATAL 消息(例如,“main()”),因为我只知道如果我因为它们而即将退出应用程序,它们是致命的。
因此,在这个地方(或者如果您有多个应用程序入口点,则为少数),使用“syslog”或类似的特殊类或 MDC 实例化 Log4j Logger。在捕获一个即将成为致命错误时,以通常的方式记录它(对于您的其他日志文件等),但也要在这个新的“syslog”记录器上调用 fatal() 方法,只使用您的精确消息想要(例如只有异常类和消息但没有堆栈跟踪)。然后将 Log4j 配置为仅将这个“syslog”类或 MDC 定向到新配置的以 SysLog 为目标的 Appender。
达顿!