【问题标题】:switching FileAppenders on the fly即时切换 FileAppender
【发布时间】:2013-10-17 20:15:55
【问题描述】:

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

每个方法都接受一个字符串输入并将其写入 System.out.println,如果 logger 不为空,则写入 logger。

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

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

这就是我卡住的地方。

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

我不知道该怎么做是神奇地使用 Log4j 将该 Thread 的唯一 FileAppender 传达给这个遗留日志记录类。

想法?提示?建议?

标记

【问题讨论】:

    标签: log4j log4j2


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      • 2011-09-29
      相关资源
      最近更新 更多