21

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

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

4

8 回答 8

17

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

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

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

于 2008-12-08T03:32:25.157 回答
11

这是我使用的实际代码:

import org.apache.log4j.PatternLayout;

public class NoStackTracePatterLayout extends PatternLayout {

 @Override
 public boolean ignoresThrowable(){
  return false;
 }
}
于 2009-11-24T08:58:33.613 回答
9

如果您使用 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}
于 2015-03-25T17:02:38.953 回答
6

在 1.2.16 中,您可以使用 EnhancedPatternLayout

于 2010-06-15T20:13:49.380 回答
4

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

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

于 2018-04-24T19:59:20.203 回答
2

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

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

于 2009-05-29T14:47:15.833 回答
1

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

于 2008-12-08T03:20:59.160 回答
0

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

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

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

达顿!

于 2008-12-08T05:55:43.763 回答