Является ли log4j FileAppender потокобезопасным? Могу ли я изменить имя файла на лету?

Я запускаю веб-приложение Java, развернутое в Tomcat. Мы используем commons-logging как оболочку вокруг log4j v1.2.16

У нас есть много одновременных запросов, поступающих на сервер, и мы не хотим отлаживать/отслеживать каждый запрос. Однако для некоторых пользователей мы хотим отслеживать их транзакции в целях отладки. Мы поддерживаем список, полученный из базы данных, каких пользователей отслеживать. Когда запрос поступает, мы проверяем наш список, чтобы увидеть, должны ли мы отслеживать файл.

Они передают свое имя пользователя в строке GET, и у нас нет проблем с его получением, добавлением его в MDC, а затем печатью перед сообщением журнала в файле с помощью ConversionPattern.

Теперь мы хотим создать файл для каждого пользователя, для которого у нас есть трассировка, и мое решение для этого состояло в том, чтобы создать собственное расширение для RollingFileAppender, на которое направлено все ведение журнала.

Если уровень журнала trace, мы проверяем MDC.get("traceOn"), чтобы увидеть, должны ли мы выводить.

Затем я делаю следующее (грязный пример):

    String file = "/var/log/tomcat6/application/trace/"+MDC.get("username")+".log";
    this.setFile(file);
    this.activateOptions();

    super.doAppend(event);

Я знаю, что MDC работает для каждого потока, но безопасно ли запускать его в рабочей среде с 10 параллельными потоками, регистрирующими и потенциально записывающими в свои собственные файлы?

Если нет, то как я могу добиться того же — записи в несколько файлов журналов на основе MDC (должны ли мы вообще вести журнал и какое имя файла использовать, если да)?


person Morris Fauntleroy    schedule 24.10.2014    source источник


Ответы (1)


log4j является потокобезопасным. Компоненты Log4j предназначены для использования в сильно многопоточных системах. Ссылка: https://logging.apache.org/log4j/1.2/faq.html#a1.7

Автоматическая перенастройка:
При настройке из файла Log4j имеет возможность автоматически обнаруживать изменения в файле конфигурации и перенастраивать себя. Если атрибут monitorInterval указан в элементе конфигурации и ему присвоено ненулевое значение, то файл будет проверен в следующий раз, когда событие журнала будет оцениваться и/или записываться в журнал, а интервал monitorInterval истек с момента последней проверки. В приведенном ниже примере показано, как настроить атрибут, чтобы файл конфигурации проверялся на наличие изменений только по истечении не менее 30 секунд. Минимальный интервал составляет 5 секунд.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
...
</Configuration>

Ссылка: http://logging.apache.org/log4j/2.x/manual/configuration.html

person Sagar Pudi    schedule 24.10.2014
comment
Спасибо. Но я спрашиваю конкретно о том, безопасно ли менять конфигурацию на лету. Создается ли новый объект Appender для каждого сеанса? При переопределении конструктора и выводе сообщения я не смог увидеть это сообщение на выходе. - person Morris Fauntleroy; 24.10.2014
comment
Мой грязный пример работает, и журналы, кажется, идут в правильные места, но я все еще беспокоюсь о развертывании в рабочей среде, не найдя какой-либо документации или эксперимента, в котором я могу доказать, что это безопасно. - person Morris Fauntleroy; 24.10.2014