Инициализируйте slf4j с помощью log4j2.xml - PullRequest
0 голосов
/ 12 сентября 2018

Я хочу использовать 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>

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Я проверил эту конфигурацию.Файл log4j2 должен находиться в вашем пути к классам.

Maven

<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
    </dependency>

log4j2.xml

Кроме того, добавлениеXSD поможет вам в создании конфигурации.Я добавил Logger для весны рамки.Обратите внимание, что jcl-over-slf4j необходим для работы с внутренним журналом Spring

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error"
               xmlns="http://logging.apache.org/log4j/2.0/config"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://logging.apache.org/log4j/2.0/config
                https://raw.githubusercontent.com/apache/logging-log4j2/master/log4j-core/src/main/resources/Log4j-config.xsd">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%highlight{%d{HH:mm:ss.SSS} [%t] %-5level %logger{36}} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
        <Logger name="org.springframework" level="error">
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>
0 голосов
/ 12 сентября 2018

Из вашего вопроса мне не кажется, что вы пытаетесь указать пользовательскую конфигурацию!См. Automatic Configuration раздел в документации :

Log4j может автоматически настраиваться во время инициализации.Когда Log4j запускается, он находит все подключаемые модули ConfigurationFactory и размещает их в порядке взвешивания от наивысшего к низшему.При поставке Log4j содержит четыре реализации ConfigurationFactory: одну для JSON, одну для YAML, одну для свойств и одну для XML.

Log4j проверит системное свойство "log4j.configurationFile" и, если установлено, попытаетсязагрузить конфигурацию, используя ConfigurationFactory, который соответствует расширению файла.

  • Если не установлено системное свойство, ConfigurationFactory будет искать log4j2-test.properties в classpath.

  • Если такой файл не найден, Конфигурация YAML будет искать log4j2-test.yaml или log4j2-test.yml в пути к классам.

  • Если нет такогофайл найден, JSON ConfigurationFactory будет искать log4j2-test.json или log4j2-test.jsn в пути к классам.

  • Если такой файл не найден, XML ConfigurationFactory будет искать log4j2-test.xml в classpath.

  • Если не удается найти тестовый файл, свойства ConfigurationFactory будут выглядеть следующим образом:r log4j2.properties в classpath.

  • Если файл свойств не может быть найден, то YAML ConfigurationFactory будет искать log4j2.yaml или log4j2.yml в classpath.

  • Если файл YAML не может быть найден, JSON ConfigurationFactory будет искать log4j2.json или log4j2.jsn в пути к классам.

  • Если файл JSON не может быть найден,XML ConfigurationFactory попытается найти log4j2.xml в пути к классам.

  • Если файл конфигурации не найден, будет использоваться DefaultConfiguration.Это приведет к тому, что вывод журнала будет поступать на консоль.

Возможно, вы переусердствовали здесь.

Вы можете поместить его "в путь к классам", поместивон находится в папке src/main/resources или указывается в командной строке с помощью -cp/-classpath.

...