【问题标题】:log4j - on ERROR, log DEBUG?log4j - 出现错误,记录调试?
【发布时间】:2014-04-24 19:50:12
【问题描述】:

我对log4j(v2)比较陌生,但我相信我已经用尽了我的资源,所以我来这里问我的问题。

我有一个有效的 log4j 配置,我将把它附加到我的问题的末尾。该应用程序使用 cronjob 每 x 分钟运行一次。

我希望看到的 log4j 行为如下:

  1. 所有 INFO(及以上)记录都记录到文件 A
  2. 所有 ERROR(及以上)记录都记录到文件 B
  3. 如果出现错误(或错误),则会发送一封邮件,其中包含给定执行的 DEBUG(及错误)行。

我使用下面的配置实现了 1 和 2。使用 log4j 是否也可以使用 3 号(如果没有,为什么不呢?)如果可以,怎么做?

当前配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <RandomAccessFile name="LogFile" fileName="/var/log/fileA.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </RandomAccessFile>
    <RandomAccessFile name="ErrorLogFile" fileName="/var/log/fileB.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </RandomAccessFile>
    <SMTP name="MailError" subject="Error occurred" to="a@b.com" smtpHost="mail.foo.bar" from="b@c.net"/>
    <Async name="Async">
      <AppenderRef ref="LogFile"/>
    </Async>
    <Async name="Errors">
      <AppenderRef ref="ErrorLogFile"/>
      <AppenderRef ref="MailError"/>
    </Async>
  </Appenders>
  <Loggers>
    <Root level="DEBUG">
      <AppenderRef ref="Console" level="INFO"/>
      <AppenderRef ref="Async" level="INFO"/>
      <AppenderRef ref="Errors" level="ERROR"/>
    </Root>
  </Loggers>
</Configuration>

【问题讨论】:

  • 数字 3 应该可以通过缓冲日志语句来实现,正如 here 为 logback 建议的那样(类似的东西应该在 log4j 中可用)。
  • @vanOekel 好的,但是我必须自己编写附加程序?
  • 是的,但这是一个常见的用例(在检测到错误后编写调试日志),所以我希望在某个地方有一个通用的解决方案,我只是找不到。
  • @vanOekel 我也找不到 :( 而且我不知道这是否可能,因为这将是某种“逆阈值过滤器”,但 log4j 只知道接受/中性/拒绝,其中 NEUTRAL 的意思是“查看下一条规则,如果最后它是非决定性的,则接受”。虽然我需要相反的情况(“如果非决定性,则拒绝”)。我怀疑这是可能的..

标签: java logging log4j log4j2


【解决方案1】:

我认为您应该能够通过ThresholdFilter 实现这一目标。使您的根记录器级别为 TRACE,以便它将所有事件发送到所有附加程序,然后在每个附加程序上放置不同的阈值过滤器。 log4j2 手册包含一个示例。


(编辑)在更好地理解需求之后,我认为SMTP Appender 已经满足了您的需求:它在内部保留了触发电子邮件的 ERROR 事件之前的事件缓冲区(默认为 512)。这些前面的事件将包含在电子邮件中。

【讨论】:

  • 嗯,如果你愿意的话,请帮帮我。我可以想象 DEBUG/INFO/WARN 的 ThresholdFilter 是 NEUTRAL 和 ERROR 的 ThresholdFilter 并且可以接受。但是,如果我正确阅读了log4j documentation,这对我来说不会:如果返回值 NEUTRAL,则查询链中的下一个过滤器。如果链中没有更多过滤器,则记录日志事件。因此,在没有过滤器的情况下,默认行为是记录所有日志事件。 如果没有错误,仍然会导致日志记录。
  • 我不知道什么时候拒绝。我只知道什么时候接受。我无法创建包含拒绝的规则,除非我可以创建规则“如果没有任何规则包含错误,我想拒绝”。我不相信这是可能的?
  • 也许我没有完全理解你的问题描述。您提到“错误(及以上)”。你能更明确一点吗?我假设您的意思是错误/警告/致命。如果您想包含跟踪/调试/信息/错误但排除警告/致命,您可以为您不想要的级别设置单独的 DENY 过滤器......或者我可能仍然没有得到它。 :-)
  • 如果我的应用程序的一次执行只产生 DEBUG 和 INFO 消息,我的邮件中不需要任何输出,那么一切都很好。但是,如果我的应用程序在其运行的任何位置输出 ERROR、FATAL 或 SEVERE(ERROR 及以上),我想在我的邮箱。因为在那种情况下,调试信息也很有趣。这是否更能澄清我的问题?
  • 我明白了。 SMTP appender 为触发电子邮件的 ERROR 事件之前的所有日志事件保留一个小缓冲区(默认为 512 个事件)。因此,此缓冲区将包括触发日志事件之前的 TRACE、DEBUG 和 INFO 事件,以便为您提供有关发生情况的上下文。这已经是 SMPT Appender 实现的一部分。如果这是您正在寻找的,则无需任何自定义编码或配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多