Java log4j-发生错误,日志调试?

Java log4j-发生错误,日志调试?,java,logging,log4j,log4j2,Java,Logging,Log4j,Log4j2,我对log4j(v2)比较陌生,但我相信我已经用尽了我的资源,所以我来这里问我的问题 我有一个有效的log4j配置,我将把它附加到问题的末尾。应用程序使用cronjob每隔x分钟运行一次 我希望看到的log4j行为如下: 所有信息(及以上)记录均已完成,以归档 所有的错误(及以上)记录都是对文件B进行的 如果出现错误(或以上),将发送一封邮件,其中包含给定执行的调试(或以上)行 我使用下面的配置实现了1和2。3号是否也可以使用log4j(如果不,为什么不?),如果可以,如何使用 当前配置: &l

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

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

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

  • 所有信息(及以上)记录均已完成,以归档
  • 所有的错误(及以上)记录都是对文件B进行的
  • 如果出现错误(或以上),将发送一封邮件,其中包含给定执行的调试(或以上)行
  • 我使用下面的配置实现了1和2。3号是否也可以使用log4j(如果不,为什么不?),如果可以,如何使用

    当前配置:

    <?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>
    

    我认为您应该能够通过以下方式实现这一点:。进行根记录器级别的跟踪,以便它将所有事件发送到所有appender,然后在每个appender上放置不同的阈值过滤器。log4j2手册包含一个示例



    (编辑)在更好地理解了需求之后,我认为已经做了您需要的事情:它在内部保留了触发电子邮件的错误事件之前的事件缓冲区(默认情况下为512)。这些之前的事件将包含在电子邮件中。

    第3个应该可以通过缓冲日志语句来实现,正如logback建议的那样(类似的内容应该在log4j中提供)。@vanOekel好的,但我必须编写自己的appender?是的,但这是一个常见的用例(在检测到错误后编写调试日志)所以我希望在某个地方可以找到一个通用的解决方案,我就是找不到。@vanOekel我也找不到它:(我不知道这是否可能,因为它可能是某种“反向阈值过滤器”,但log4j只知道接受/中立/否认,其中中立的意思是“见下一条规则,如果最后它是非决定性的,那么接受”.而我需要的是相反的结果(“如果不是决定性的,那么就否认”)。我怀疑这是可能的。。嗯,如果你愿意的话,请帮我一把。。我可以想象一个用于调试/信息/警告的阈值过滤器是中性的,一个用于错误和最多的阈值过滤器是可接受的。但是如果我读对了,这对我来说就不行了:如果返回中性值,那么会参考链中的下一个过滤器。如果没有更多的过滤器在链中,然后记录日志事件。因此,在没有筛选器的情况下,默认行为是记录所有日志事件。如果没有错误,仍然会记录日志。我不知道何时拒绝。我只知道何时接受。我无法创建包含拒绝的规则,除非我可以创建规则“如果所有规则都不包含错误,我想否认。”。我不相信这是可能的?也许我没有完全理解您的问题描述。您提到“错误(及以上)”“。你能更明确一点吗?我想你指的是ERROR/WARN/FATAL。如果你想包括trace/debug/info/ERROR,但不包括WARN/FATAL,你可以为你不想要的级别设置单独的拒绝筛选器…或者可能我仍然没有得到它。:-)如果我的应用程序的一次执行只产生调试和信息消息,我的邮件中不需要任何输出,然后一切都很顺利。但是,如果我的应用程序在其运行的任何位置输出错误,致命或严重(错误和以上),我希望在邮箱中接收来自该特定运行的所有消息(调试、信息、警告、错误、致命、严重)。因为在这种情况下,调试信息也很有趣。。我明白了,这能进一步澄清我的问题吗。SMTP appender保留触发电子邮件的错误事件之前的所有日志事件的小缓冲区(默认情况下为512个事件)。因此,该缓冲区将包括触发日志事件之前的跟踪、调试和信息事件,以便为您提供所发生事件的上下文。这已经是SMPT Appender实现的一部分。如果这是您正在寻找的,那么就不需要任何自定义编码或配置。