Вход в другой файл в соответствии с потоком - PullRequest
5 голосов
/ 27 февраля 2011

У меня есть приложение с несколькими «контроллерами», и я бы хотел, чтобы каждый журнал имел свой собственный файл. Это достаточно просто для их собственного кода, но я также использую некоторый библиотечный код, который использует ведение журнала. Могу ли я как-нибудь заставить этот код войти в файл, относящийся к контроллеру?

Я думал, что смогу как-то сделать это по нитке:

class Controller {

 public void action() {
  setCurrentThreadLogFile(myLogFile);
  try {
   Library.stuff();
  } finally {
   restoreCurrentThreadLogFile();
  }
 }

}

В настоящее время я использую Commons-Logging для своей собственной регистрации, с log4j в качестве бэкэнда. Но я мог бы изменить это, если необходимо, или использовать микс (это возможно в рамках ведения журнала общего достояния).

Один из способов сделать это - написать свою собственную реализацию регистрации общего ресурса (возможно, обертку вокруг log4j), но существует ли решение?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Вы, вероятно, хотите посмотреть на отображенные диагностические контексты (MDC).Ведение журнала Commons не поддерживает их, но Log4J поддерживает, поэтому вам нужно будет перейти непосредственно к Log4J, чтобы настроить это.Вам, вероятно, придется свернуть свой собственный фильтр для фильтрации с использованием MDC и применить его к аппендерам.

Если вы хотите изменить реализации ведения журналов, вы можете использовать SL4J в качестве фасада ведения журнала и Logback в качестве реализации ведения журнала.Попросите контроллер или какой-либо фильтр / перехватчик добавить значение дискриминатора для ключа, который вы собираетесь использовать для распознавания контроллеров в MDC .Используйте SiftingAppender , чтобы разделить событие журнала на отдельные файлы.

1 голос
/ 27 февраля 2011

регистратор на поток? Поместите регистратор в ThreadLocal. Если вы используете java.util.logging, Handler может сделать это прозрачным для звонящего.

...