2

log4cxx 的配置是通过以下方式从后续 xml 读取的:

DOMConfigurator::configure("log4cxx.xml");

但是,想要在运行时设置文件名,这会产生一个问题,即要么有多个 .xml 用于读取,要么动态创建一个(在内存/磁盘中——无论在哪里)。

  <appender name="appxNormalAppender" class="org.apache.log4j.FileAppender">
    <param name="file" value="appxLogFile.log" />
    <param name="append" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d %-5p [%t:%x] %C{2} (%F:%L) - %m%n" />
    </layout>
  </appender>

有没有办法<param file="file" value="%%value%%" />在配置和更改后将一些值传递给配置器以替换或访问属性?

PS这样做的原因:同一个程序的多个副本正在写入同一个日志,使它看起来很奇怪。如何在不发明太多自行车的情况下以传统方式使用 log4j/log4cxx 避免这种情况?

4

1 回答 1

0

这个问题大约在 2 年前袭击了我;我无法再访问源代码,但我或多或少就是这样做的:

  1. 扩展 FileAppender 并在配置文件中使用它。
  2. setFile()方法中,我将进程名称和 id 附加到文件名(setOption()如果您不使用滚动文件,您可以在方法中执行此操作。

我们已经有了一种机制,可以通过我们的内部 id 来唯一地识别我们的流程及其实例;例如,您可以使用 PID,或者添加一个全局变量并在每个应用程序中使用 log4cxx 将其设置为您的唯一值,然后在setOptionappender 的方法中使用它。

另请参阅我的答案:使用 Log4j CompositeTriggeringPolicy 功能与 log4CXX

于 2011-09-29T17:51:36.870 回答