Я работаю в проекте, который использует Log4J . Одним из требований является создание отдельного файла журнала для каждого потока; сама по себе это была странная проблема, которая была отчасти упорядочена путем создания нового FileAppender на лету и присоединения его к экземпляру Logger.
Logger logger = Logger.getLogger(<thread dependent string>);
FileAppender appender = new FileAppender();
appender.setFile(fileName);
appender.setLayout(new PatternLayout(lp.getPattern()));
appender.setName(<thread dependent string>);
appender.setThreshold(Level.DEBUG);
appender.activateOptions();
logger.addAppender(appender);
Все шло хорошо, пока мы не поняли, что другая используемая нами библиотека - Spring Framework v3.0.0 (в которой используется Commons Logging ) - не играет в мяч с помощью описанной выше техники - Spring данные журналов «видны» только Appenders, инициализированными из файла log4.configuration, но не созданными во время выполнения Appenders.
Итак, вернемся к исходной точке.
После некоторого исследования я обнаружил, что у нового и улучшенного LogBack есть аппендер - SiftingAppender - который делает именно то, что нам нужно, то есть ведение журнала на уровне потоков в независимых файлах.
В настоящее время переход на LogBack не является вариантом, поэтому, застряв в Log4J, как я могу достичь функциональности, подобной SiftingAppender, и сохранить Spring также счастливым?
Примечание: Spring используется только для JdbcTemplate функциональности, без IOC; для того, чтобы «зацепить» регистрацию Commons Spring в Log4J, я добавил эту строку в файл log4j.properties:
log4j.logger.org.springframework = DEBUG
как указано здесь .