Java 如何禁用标记记录器上的可加性?

Java 如何禁用标记记录器上的可加性?,java,logging,configuration,log4j,log4j2,Java,Logging,Configuration,Log4j,Log4j2,我已经定义了一个标记,只想将其记录到一个特定的文件中。因此,我试图设置additivity=false。但是它不起作用,并且仍然被记录到我的全局日志文件中。这里可能出了什么问题 <Configuration> <Appenders> <RollingFile name="TEST" fileName="test.log" filePattern="test1.log"> <MarkerFilter mark

我已经定义了一个
标记
,只想将其记录到一个特定的文件中。因此,我试图设置
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>

在示例代码中,标记名为
“TEST”
,但在配置中,标记过滤器仅接受带有标记
“TEST\u log”
的日志事件。配置和代码应该使用相同的字符串


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

在示例代码中,标记名为
“TEST”
,但在配置中,标记过滤器仅接受带有标记的日志事件
“TEST\u log”
。配置和代码应该使用相同的字符串


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

我注意到的两件事:

  • 对于这两个MarkerFilter,您应该在代码和配置中使用相同的标记字符串
  • 您需要添加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>

请注意,在代码和两个附加器的筛选器中使用相同的“MY_MARKER”字符串非常重要。这样,全局文件的appender就可以使用该过滤器来拒绝标记的日志事件。

我注意到了以下几点:

  • 对于这两个MarkerFilter,您应该在代码和配置中使用相同的标记字符串
  • 您需要添加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>

请注意,在代码和两个附加器的筛选器中使用相同的“MY_MARKER”字符串非常重要。这样,全局文件的appender可以使用该筛选器拒绝标记的日志事件。

在您的情况下,Additivity将不起作用,因为Additivity控制特定记录器不继承父级的appender

在配置中,您将logger
foo
设置为具有
additivity
=false,这意味着,除非您使用
foo
或其子记录器进行日志记录,否则您仍将遵循根记录器的配置。(我在你的帖子中看不到你的根记录器配置,我怀疑它指的是两个appender)。从您引用的代码来看,您正在使用根记录器进行日志记录,
foo
logger的配置根本不会生效

我可以提出两种解决方案:

  • 对于使用
    TEST\u log
    marker记录的所有日志消息,请确保使用
    foo
    logger记录。或者
  • 如果您需要为
    TEST\u LOG
    消息使用任何记录器,那么您应该重新配置您的appender,以便您的
    GLOBAL
    文件appender接受除
    TEST\u LOG
    之外的任何内容。(目前您仅拒绝
    SELL\u FAILURE
    marker)
  • 正确的解决方案取决于您的实际需求。确保您了解基本概念,以便为自己选择正确的解决方案


    编辑:

    首先,即使您在评论中提到了“正确”的配置,不同记录器的问题仍然存在。这意味着,因为您使用根日志记录器来进行日志记录,所以
    foo
    logger的配置与日志消息无关,在您的情况下,可加性是不可想象的

    我没有使用Log4J2,简要检查一下过滤器的使用情况会发现两个问题:

    首先,我认为定义多个过滤器的正确方法是使用复合过滤器(这意味着在
    元素中定义,尽管我没有从Log4J的文档中完全了解语法)

    第二,即使您在复合过滤器中定义了它,您的配置仍然会有问题。当日志事件具有INFO或更高级别时,您可以在筛选器中声明它是
    接受
    拒绝
    ,这将禁止后续筛选器求值。如果要使用
    INFO
    记录消息,但不包含
    TEST\u log
    标记,则应执行以下操作:

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

    NEUTRAL
    表示当前筛选器无法确定是接受还是拒绝消息,并将对下一个筛选器求值以确定消息。

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

    在配置中,您将logger
    foo
    设置为具有
    additivity
    =false,这意味着,除非您使用
    foo
    或其子记录器进行日志记录,否则您仍将遵循根记录器的配置。(我在你的帖子中看不到你的根记录器配置,我怀疑它指的是两个appender)。从您引用的代码来看,您正在使用根记录器进行日志记录,
    foo
    logger的配置根本不会生效

    我可以提出两种解决方案:

  • 对于使用
    TEST\u log
    marker记录的所有日志消息,请确保使用
    foo
    logger记录。或者
  • 如果您需要为
    TEST\u LOG
    消息使用任何记录器,那么您应该重新配置您的appender,以便您的
    GLOBAL
    文件appender接受除
    TEST\u LOG
    之外的任何内容。(目前您仅拒绝
    SELL\u FAILURE
    marker)
  • 正确的解决方案取决于您的实际需求。确保您了解基本概念,以便选择
    <MarkerFilter marker="TEST_LOG" onMatch="DENY" onMismatch="NETURAL"/>
    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>