动态切换FileAppenders

时间:2013-10-17 20:15:56

标签: log4j log4j2

我有一个遗留日志记录类。它有一个静态Logger引用(名为logger)和一堆静​​态方法。

如果logger不为null,则每个方法都接受一个String输入并将其写入System.out.println和logger。

它有一个初始化记录器的构造函数。但是这个构造函数只有包范围,我很确定它不会被调用。因此,logger始终为null,并且该类基本上只执行System.out.println

我想更改它,以便它可以在多线程应用程序中使用,其中每个线程都写入其自己唯一的FileAppender。

这就是我被困住的地方。

基本上,我想要做的是将这个静态类与一堆不同的log4j FileAppender相关联。每个FileAppender都可以由Thread创建,文件名可以从Thread已知的唯一信息派生。

我无法弄清楚怎么做才是神奇地使用Log4j将Thread唯一的FileAppender传递给这个遗留日志类。

想法?提示?建议?

标记

1 个答案:

答案 0 :(得分:0)

可以使用RoutingAppender和ThreadContext映射动态更改目标日志文件名。

这一切都可以通过配置完成(不需要线程创建FileAppenders的自定义代码)。在RoutingAppender配置中,您可以指定要用于切换目标FileAppender的ThreadContext键。例如,您可以使用字符串“ROUTINGKEY”。每个线程在ThreadContext映射中为键“ROUTINGKEY”放置一个唯一值,该值用于选择日志事件路由到的Appender。您甚至可以将其设置为动态创建文件名中包含ROUTINGKEY值的日志文件,因此不需要事先知道所有目标日志文件。

FAQ页面有一个很好的例子:http://logging.apache.org/log4j/2.x/faq.html#separate_log_files