Log4J - 类似 SiftingAppender 的功能

2024-03-12

我在一个使用的项目中工作Log4J http://logging.apache.org/log4j/1.2/index.html。要求之一是为每个线程创建一个单独的日志文件;这本身就是一个奇怪的问题,通过动态创建一个新的 FileAppender 并将其附加到 Logger 实例来进行排序。

Logger logger = Logger.getLogger(<thread dependent string>);
FileAppender appender = new FileAppender();
appender.setFile(fileName);
appender.setLayout(new PatternLayout(lp.getPattern()));
appender.setName(<thread dependent string>);
appender.setThreshold(Level.DEBUG);
appender.activateOptions();
logger.addAppender(appender);

一切都很顺利,直到我们意识到我们使用的另一个库 -Spring框架 http://www.springsource.org/v3.0.0(使用公共日志记录 http://commons.apache.org/logging/) - 与上述技术不起作用 - Spring 日志记录数据只能被从 log4.configuration 文件初始化的 Appender“看到”,而不能被运行时创建的 Appender“看到”。 那么,回到第一个方面。

经过一番调查,我发现新的和改进的LogBack http://logback.qos.ch/有一个附加器 -筛选Appender http://logback.qos.ch/apidocs/ch/qos/logback/access/sift/SiftingAppender.html– 这正是我们所需要的,即独立文件上的线程级日志记录。

目前,迁移到 LogBack 不是一个选择,因此,在使用 Log4J 的情况下,我怎样才能实现类似 SiftingAppender 的功能并让 Spring 满意呢?

注意:Spring仅用于Jdbc模板 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html功能,无IOC;为了将 Spring 的 Commons Logging“挂钩”到 Log4J,我在 log4j.properties 文件中添加了这一行:

log4j.logger.org.springframework=调试

按照指示here http://commons.apache.org/logging/guide.html#Configuring%20Log4J.


在Log4j2中,我们现在可以使用路由附加器 https://logging.apache.org/log4j/2.x/manual/appenders.html#RoutingAppender:

RoutingAppender 评估 LogEvents,然后将它们路由到从属 Appender。目标Appender可以是先前配置的Appender,并且可以通过其名称来引用,或者可以根据需要动态创建Appender。

来自他们的FAQ http://logging.apache.org/log4j/2.x/faq.html#separate_log_files:

如何动态写入单独的日志文件?查看 RoutingAppender。您可以在配置中定义多个路由,并将值放入 ThreadContext 映射中,以确定该线程中的后续事件将记录到哪个日志文件中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Log4J - 类似 SiftingAppender 的功能 的相关文章

随机推荐