Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Log4j 动态切换FileAppender_Log4j_Log4j2 - Fatal编程技术网

Log4j 动态切换FileAppender

Log4j 动态切换FileAppender,log4j,log4j2,Log4j,Log4j2,我有一个遗留日志类。它得到了一个静态记录器引用(名为Logger)和一系列静态方法 每个方法都接受一个字符串输入,并将其写入System.out.println,如果logger不为null,则写入logger 它有一个初始化记录器的构造函数。但是这个构造函数只有包的作用域,我很确定它不会在任何地方被调用。因此,logger始终为null,并且该类实际上只执行System.out.println 我想改变这一点,以便它可以在多线程应用程序中使用,其中每个线程都会写入自己唯一的FileAppend

我有一个遗留日志类。它得到了一个静态记录器引用(名为Logger)和一系列静态方法

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

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

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

这就是我被困的地方

基本上,我想做的是让这个静态类与一堆不同的log4j文件追加器相关联。每个FileAppender都可以由线程创建,并且文件名可以从线程已知的唯一信息派生

我不知道如何神奇地使用Log4j将该线程的唯一FileAppender与这个遗留日志类通信

想法?提示?建议


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

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

常见问题页面有一个很好的例子: