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
表示当前筛选器无法确定是接受还是拒绝消息,并将对下一个筛选器求值以确定消息。在您的情况下,可加性不起作用,因为可加性控制特定记录器不继承父级的附加器
在配置中,您将loggerfoo
设置为具有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"/>