Я хочу использовать slf4j поверх log4j.Я добавил следующие зависимости в свой pom.xml (я использовал 1.7.25 для slf4j и 2.10.0 для log4j2):
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
Все строится просто отлично, без ошибок компиляции или отсутствия зависимостей, но яНе удалось указать файл конфигурации (log4j2.xml) в моем классе, который отвечает за инициализацию Logger.В этой ситуации всегда выводится одно и то же предупреждение
log4j:WARN No appenders could be found for logger (com.mypackage.etc).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Я искал правильный способ предоставления файла конфигурации и в итоге получил следующее:
LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false);
File file = new File("path/to/a/different/log4j2.xml");
context.setConfigLocation(file.toURI());
Проблема в том, что в моемcase LogManager.getContext (false) всегда будет возвращать экземпляр Slf4JLoggerContext (учитывая, что я использую slf4j в качестве фасада для регистратора), и инициализация завершится с ClassCastException.Я пытался сохранить этот экземпляр Slf4JLoggerContext, но он не предлагает установки для контекста.Также мне не удалось найти способ извлечь LoggerContext из log4j.
Есть ли способ предоставить файл конфигурации (log4j2.xml) для slf4j, чтобы увидеть все приложения и регистраторы?
Обновление Считайте, что это мой файл конфигурации (я заменил исходные имена пакетов и приложений):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="def.files.backup.count">10</Property>
<Property name="log.file.path">${oo.home}/var/logs</Property>
<Property name="def.file.max.size">10MB</Property>
<Property name="log.level">WARN</Property>
</Properties>
<ThresholdFilter/>
<Appenders>
<RollingFile name="Appender1" fileName="${log.file.path}/file1.log" maxFileSize="${def.file.max.size}"
maxBackupIndex="${def.files.backup.count}">
<PatternLayout>org.apache.log4j.PatternLayout</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
</RollingFile>
<RollingFile name="Appender2" fileName="${log.file.path}/file2.log"
maxFileSize="${def.file.max.size}"
maxBackupIndex="${def.files.backup.count}">
<PatternLayout>org.apache.log4j.PatternLayout</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
</RollingFile>
<RollingFile name="Appender3" fileName="${log.file.path}/file3.log"
maxFileSize="${def.file.max.size}"
maxBackupIndex="${def.files.backup.count}">
<PatternLayout>org.apache.log4j.PatternLayout</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<AsyncLogger name="com.package1.oo" level="${log.level}" additivity="false">
<AppenderRef ref="Appender1"/>
</AsyncLogger>
<AsyncLogger name="io.package2" level="${log.level}" additivity="false">
<AppenderRef ref="Appender2"/>
</AsyncLogger>
<AsyncLogger name="com.package3.package3" level="${log.level}" additivity="false">
<AppenderRef ref="Appender3"/>
</AsyncLogger>
<AsyncLogger name="org.package4" level="${log.level}">
</AsyncLogger>
<AsyncLogger name="com.package5.Class1" level="${log.level}">
</AsyncLogger>
<AsyncRoot level="${log.level}">
<AppenderRef ref="Appender1"/>
<AppenderRef ref="Appender2"/>
<AppenderRef ref="Appender3"/>
</AsyncRoot>
</Loggers>
</Configuration>