Я запускаю веб-приложение 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 (должны ли мы вообще вести журнал и какое имя файла использовать, если да)?