我正在尝试使用Log4j 2的新RoutingAppender来根据MDC(Log4j 2中的ThreadContext)路由不同的日志。我想做的是:
- 如果MDCMap具有$contextId -〉附加到$contextId附加器(特定日志)
- 如果MDC没有$contextId -〉附加到主附加器(常规日志)
我希望在标记中使用通配符模式来实现这一点,然后使用for contextId(${ctx:contextId})中的key参数进行过滤,并对主附加器使用默认值(没有key参数),但我不知道哪个值是通配符。
任何帮助都是感激的,也许我是从错误的道路上接近这一点。我一直在阅读有关过滤器,但似乎没有工作,因为我想要的。
谢谢你!
5条答案
按热度按时间jdzmm42g1#
这是否回答了您的问题?https://issues.apache.org/jira/browse/LOG4J2-326
雷姆科
niknxzdl2#
感谢Remko的链接,我已经找到了一个临时的解决方案,直到该特性得到改进的家伙Log4j 2.该解决方案是使用RoutingAppender和过滤器.这是我的log4j 2配置看起来像(我有属性定义,但我没有显示在这里):
我所做的是调用ThreadContext.put(“contextId”,“”)或ThreadContext.put(“contextId”,“something”),这取决于我想要记录的追加器。我希望wildward特性很快实现,但目前,这个解决方案对我来说已经足够了。
谢谢你!
6za6bjd03#
感谢hveiga跟进并发布您的解决方案,这很有帮助。我想说的是,您可以通过添加第二个“路由”来避免您的过滤器解决方案,该路由可以路由所有没有路由关键字值的消息,如下所述:http://logging.apache.org/log4j/2.x/faq.html#separate_log_files
因此,更新后的log4j配置将如下所示。
在您的应用程序中,您可以通过调用ThreadContext.put(“contextId”,“something”)来设置ThreadContext,并在完成后通过调用ThreadContext.clear()或ThreadContext.remove(“contextId”)来清除它
最后,我使用了
元素(类似于上面链接的示例),而不是
我相信当您从log4j迁移到log4j2时,这是首选的。
mrphzbgm4#
我对使用https://issues.apache.org/jira/browse/LOG4J2-326和http://logging.apache.org/log4j/2.x/faq.html#separate_log_files中描述的技巧定义回退路由的解决方案不满意,因为这迫使我复制路由中包含的附加器配置。我不需要为默认路由提供不同的附加器配置,而只需要为常规日志提供适当的文件名。
如果在默认属性Map中查找在其上下文中未定义的属性,请参见https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution,我认为最直接的方法就是定义默认值,例如
并且在线程上下文不具有${ctx:fruits}的情况下,采用“any_fruits”。
ibrsph3r5#
使用www.example.com中的RoutingAppender创建动态多个日志文件lo4j2.properties