我已经定义了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");
答案 0 :(得分:2)
在示例代码中,标记名为"TEST"
,但在配置中,MarkerFilter仅接受标记为"TEST_LOG"
的日志事件。配置和代码应该使用相同的字符串。
此外,您可能需要定义两个Appender:一个用于全局日志文件,另一个用于特定(标记)日志事件。然后仅在特定的appender中接受标记的日志事件,并在全局appender中删除标记的日志事件。
答案 1 :(得分:1)
我发现了一些事情:
这给你这个配置:
<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
记录器的配置根本无法生效。
我可以建议两种解决方案:
TEST_LOG
标记记录的所有日志消息,请确保使用foo
记录器进行记录。或者,TEST_LOG
消息使用任何记录器,那么您应该重新配置您的appender,以便您的GLOBAL
文件追加器接受任何但TEST_LOG
。 (目前您只是拒绝SELL_FAILURE
标记)正确的解决方案取决于您的实际要求。确保您了解基本概念,以便为您选择合适的解决方案。
编辑:
首先,即使你的&#34;正确&#34;您在评论中提到的配置,不同记录器的问题仍然存在。这意味着,如果你使用root logger来进行日志记录,那么foo
logger的配置与你的日志消息无关,而且你的情况下可加性是不可能的。
我没有使用Log4J2,对过滤器使用情况的简要检查引导我两个问题:
首先,我认为定义多个过滤器的正确方法是使用复合过滤器(这意味着在<Filters>
元素中进行定义,尽管我还没有从Log4J&#39获得语法; s doc)。
其次,即使你在复合过滤器中定义它,你的配置仍然会有问题。当日志事件具有INFO或更高级别时,您在过滤器中声明它是ACCEPT
或DENY
,这将禁止后续过滤器评估。如果您要使用INFO
并且不包含TEST_LOG
标记来记录邮件,则应执行以下操作:
<MarkerFilter marker="TEST_LOG" onMatch="DENY" onMismatch="NETURAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
NEUTRAL
表示当前过滤器无法确定是接受还是拒绝该消息,并将评估下一个过滤器以确定它。