当前位置: 首页 > 知识库问答 >
问题:

在运行中切换FileAppender

慕容成文
2023-03-14

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

每个方法接受一个字符串输入并将其写入系统。出来如果记录器不为null,则println和to记录器。

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

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

这就是我被困的地方。

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

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

思想?提示?建议?

做记号

共有1个答案

芮岳
2023-03-14

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

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

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

 类似资料:
  • 我在运行Windows XP sp3的计算机上安装了Java 6和Java 7。我已在计算机中的环境变量(path、JAVA_HOME)中输入path- java-版本 我还是收到下面的短信 Java版本"1.7.0_09"Java(TM)SE运行时环境(构建1.7.0_09-b05)JavaHotSpot(TM)客户端VM(构建23.5-b02,混合模式,共享) 然而,当我尝试 javac-版本

  • 为了给你一些上下文,解决方案1说: 使用根植于test/目录(即上表中的中间列)的绝对导入。这保证了直接运行始终有效。为了直接运行,请将其作为导入的模块而不是作为脚本运行: 将目录更改为控制台中的 可以更改(取2) 一个更难处理的问题是下面的例子。假设从来不需要直接运行,而是由直接运行的和导入。 在这种情况下,使用上面描述的解决方案1将不起作用。然而,其他解决方案仍然有效。

  • 问题内容: 我正在尝试使用php在mysql中切换两行的ID-我读得越多,我就越困惑。似乎有很多相互矛盾的信息。有没有人得到明确的答案。 例如,在初始状态下,我的行是 然后我想交换第2行和第3行的ID,以便它看起来像这样 因此,如果我随后按ID订购,我将拥有 问题答案: 如果ID是主键,则您不想更改它/可以更改它。 如果这仅用于排序,我建议创建一个“ order”列,该列是整数并对其进行排序。表架

  • 问题内容: 我在有菜单按钮的项目中使用react。 还有一个Sidenav组件,例如: 我编写了以下代码来切换菜单: 事实是,这不是DOM元素,我无法在他上添加类。 有人可以向我解释如何像在按钮上一样在组件上切换类吗? 问题答案: 如果您想让React正确高效地渲染DOM,则必须使用组件的State来更新组件参数,例如Class Name。 更新:我更新了示例,以在单击按钮时切换Sidemenu。

  • 有什么方法可以改变HtmlUnit中带有会话的url吗? 我的案子就像下面这样, null 这在HtmlUnit本身可能吗? 我的示例代码

  • 我正试图获得一个可切换的边栏: 无边栏: 带侧边栏: (以下是一个行为示例:http://pythonhosted.org/cloud_sptheme--请参见侧栏上的按钮。使用其代码库并不容易,因为它不是基于引导的) 我从一个使用Bootstrap 2和jQuery 1.8的工作示例开始:jsfiddle,SO question,并试图使其在Bootstrap 3上工作。下面是一个代码(boot