Первоначальная идея переконфигурировать Log4j2 не была хорошей, так как это нарушило бы ведение журнала для всех зависимостей, которые используют Log4j2 API для внутреннего использования. SLF4JLoggingContextFactory
гарантирует, что все эти журналы будут перенаправлены на то, что настроено SLF4J (обычно Logback в случае приложения Spring Boot).
Таким образом, подсказка из комментария выше для создания нескольких экземпляров LoggingContextFactory
была ведя меня в правильном направлении.
В следующем классе реализован очень простой регистратор с использованием подсистемы Log4j2, полностью независимый от остальной части приложения:
public class MyLogger {
private static org.apache.logging.log4j.core.LoggerContext context;
private static org.apache.logging.log4j.Logger logger;
static {
org.apache.logging.log4j.core.async.AsyncLoggerContextSelector selector = new org.apache.logging.log4j.core.async.AsyncLoggerContextSelector();
org.apache.logging.log4j.core.impl.Log4jContextFactory factory = new org.apache.logging.log4j.core.impl.Log4jContextFactory(selector);
context = factory.getContext(MyLogger.class.getName(), null,null, true);
logger = context.getLogger("MyLogger");
}
public static void info(String message) {
logger.info(message);
}
}
Хорошо, что что все зависимости, использующие Log4j2 в качестве своей среды ведения журналов, будут по-прежнему использовать SLF4LoggingContextFactory
, и, следовательно, все журналы отправляются в подсистему Logback. Только специальные логгеры, созданные моим экземпляром Log4jContextFactory
, будут использовать бэкэнд Log4j2.
Я знаю, что это зависит от внутренних API-интерфейсов Log4j2, но поскольку он заключен в класс MyLogger
, любой изменения внутренних API могут быть скрыты.