log4cxx: настройка appender с аргументами - PullRequest
2 голосов
/ 30 марта 2011

Конфигурация log4cxx читается из последующего XML через:

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

Но нужно, чтобы имя файла было установлено во время выполнения, и это создает проблему либо наличия нескольких файлов .xmls для чтения, либо создания файла на лету (в памяти / на диске - независимо от того, где).

  <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%%" /> или для доступа к свойству после настройки и изменения?

P.S. Причина для этого: несколько копий одной и той же программы пишут в один и тот же журнал, что выглядит как ... странно. Как избежать этого с log4j / log4cxx традиционным способом, не изобретая слишком много велосипедов?

1 Ответ

0 голосов
/ 29 сентября 2011

Эта проблема ударила меня около 2 лет назад; У меня больше нет доступа к исходному коду, но вот что я сделал, более или менее:

  1. Расширил FileAppender и использовал его в файле конфигурации.
  2. Внутри метода setFile() я добавил имя и идентификатор процесса к имени файла (вы можете сделать это в методе setOption(), если вы не используете скользящий файл.

У нас уже был механизм для уникальной идентификации наших процессов и их экземпляров по нашему внутреннему идентификатору; вы можете использовать PID, например, или добавить глобальную переменную и установить ее в каждом приложении, используя log4cxx, к вашему уникальному значению, а затем использовать его в методе setOption вашего аппендера.

См. Также мой ответ: Использование функции Log4j CompositeTriggeringPolicy с log4CXX

...