如何在标记记录器上禁用加法?

时间:2014-01-22 12:21:27

标签: java logging configuration log4j log4j2

我已经定义了Marker,并且只想将其记录到特定文件中。因此,我正在尝试设置additivity = false。但它不起作用,并且还记录到我的全局日志文件中。这可能有什么问题?

<Configuration>
    <Appenders>
        <RollingFile name="TEST" fileName="test.log" filePattern="test1.log">
            <MarkerFilter marker="TEST_LOG" onMatch="ACCEPT" onMismatch="DENY"/>
        </RollingFile>
        <RollingFile name="GLOBAL" fileName="global.log" filePattern="global.log">
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <MarkerFilter marker="TEST_LOG" onMatch="DENY" onMismatch="ACCEPT"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <logger name="foo" additivity="false">
            <appender-ref ref="TEST" />
        </logger>
    </Loggers>
</Configuration>

用法:

LogManager.getRootLogger().info(MarkerManager.getMarker("TEST_LOG"), "test log");

3 个答案:

答案 0 :(得分:2)

在示例代码中,标记名为"TEST",但在配置中,MarkerFilter仅接受标记为"TEST_LOG"的日志事件。配置和代码应该使用相同的字符串。

此外,您可能需要定义两个Appender:一个用于全局日志文件,另一个用于特定(标记)日志事件。然后仅在特定的appender中接受标记的日志事件,并在全局appender中删除标记的日志事件。

答案 1 :(得分:1)

我发现了一些事情:

  • 您应该在代码中使用相同的标记字符串,并在的配置中使用 MarkerFilters。
  • 您需要添加AppenderRef元素以将记录器连接到两个appender
  • 您可以在AppenderRef中指定一个级别,这比使用ThresholdFilter更容易

这给你这个配置:

<Configuration>
    <Appenders>
        <RollingFile name="MARKED_ONLY" fileName="markedOnly.log" filePattern="markedOnly1.log">
            <MarkerFilter marker="MY_MARKER" onMatch="ACCEPT" onMismatch="DENY"/>
        </RollingFile>
        <RollingFile name="GLOBAL" fileName="global.log" filePattern="global.log">
            <MarkerFilter marker="MY_MARKER" onMatch="DENY" onMismatch="ACCEPT"/>
        </RollingFile>
    </Appenders>

    <Loggers>
        <root level="trace">
            <appender-ref ref="MARKED_ONLY" level="trace" />
            <appender-ref ref="GLOBAL" level="info" />
        </root>
    </Loggers>
</Configuration>

这段代码:

Logger logger = LogManager.getLogger(MyClass.class); // or .getRootLogger()
logger.info(MarkerManager.getMarker("MY_MARKER"), "test log");

请注意,在代码中使用相同的“MY_MARKER”字符串以及两个appender的过滤器都很重要。这样,全局文件的appender可以使用该过滤器来清除标记的日志事件。

答案 2 :(得分:1)

在您的情况下,可加性不起作用,因为可加性是控制特定记录器不继承父级的追加器。

在您的配置中,您要设置记录器foo以使additivity = false,这意味着,除非您使用foo或其子记录器进行记录,否则您仍会关注root loggers&#39;配置。 (我无法在你的帖子中看到你的根记录器配置,我怀疑它指的是两个appender)。根据您引用的代码,您使用根记录器进行日志记录,foo记录器的配置根本无法生效。

我可以建议两种解决方案:

  1. 对于使用TEST_LOG标记记录的所有日志消息,请确保使用foo记录器进行记录。或者,
  2. 如果您需要为TEST_LOG消息使用任何记录器,那么您应该重新配置您的appender,以便您的GLOBAL文件追加器接受任何但TEST_LOG。 (目前您只是拒绝SELL_FAILURE标记)
  3. 正确的解决方案取决于您的实际要求。确保您了解基本概念,以便为您选择合适的解决方案。


    编辑:

    首先,即使你的&#34;正确&#34;您在评论中提到的配置,不同记录器的问题仍然存在。这意味着,如果你使用root logger来进行日志记录,那么foo logger的配置与你的日志消息无关,而且你的情况下可加性是不可能的。

    我没有使用Log4J2,对过滤器使用情况的简要检查引导我两个问题:

    首先,我认为定义多个过滤器的正确方法是使用复合过滤器(这意味着在<Filters>元素中进行定义,尽管我还没有从Log4J&#39获得语法; s doc)。

    其次,即使你在复合过滤器中定义它,你的配置仍然会有问题。当日志事件具有INFO或更高级别时,您在过滤器中声明它是ACCEPTDENY,这将禁止后续过滤器评估。如果您要使用INFO并且不包含TEST_LOG标记来记录邮件,则应执行以下操作:

    <MarkerFilter marker="TEST_LOG" onMatch="DENY" onMismatch="NETURAL"/>
    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
    

    NEUTRAL表示当前过滤器无法确定是接受还是拒绝该消息,并将评估下一个过滤器以确定它。

相关问题