Log4j 2 - проблема с конфигурацией

Я пытаюсь настроить log4j 2.0 для отчета журналов.

Моя конфигурация сохраняется как log4j2.xml, и это ее содержимое:

  <?xml version="1.0" encoding="UTF-8"?>
  <configuration name="PRODUCTION" status="OFF">

    <appenders>
        <RollingFile name="MyFileAppender" 
            fileName="../Logs/app.log" 
            filePattern="../Logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <pattern>%d %p %C{1.} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
            </Policies>
        </RollingFile>
    </appenders>

    <loggers>
        <root level="trace">
            <appender-ref ref="MyFileAppender"/>
        </root>
    </loggers>

 </configuration>

Он существует в пути к классам проекта, и я попытался поместить его во многие другие каталоги.

Я создал регистратор в коде следующим образом:

    Logger          logger = LogManager.getLogger(MyClass.class.getName());
    logger.info("test");

И ничего не написано и файл не создается. Когда я отлаживаю код, я вижу, что регистратор является регистратором по умолчанию (консоль).

Ответ 1

Хорошо, я решил проблему. Я должен был указать в xml пакет = "myPackage"

Ответ 2

На самом деле это прямой процесс. Ниже перечислены два основных класса Log4j 2, которые необходимо импортировать следующим образом:

    import org.apache.logging.log4j.LogManager
    import org.apache.logging.log4j.Logger

Теперь получите экземпляр Logger, используя этот код.

    private static final Logger logger = LogManager.getLogger();

Примечание. Я не указывал имя класса методу getLogger() в качестве параметра. Log4j 2 автоматически определяет это.

Теперь вы можете использовать любой из методов info(), trace(), debug(), warn(), error(), fatal() из класса Logger. Но для получения результата из всех этих методов вам понадобится файл конфигурации XML. По умолчанию Log4j 2 производит только выходные данные из методов error() and fatal().

Файл конфигурации выглядит следующим образом:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="WARN">
        <Appenders>
            <File name="MyCustomLogFile" fileName="/home/me/mylogfile.log">
                <PatternLayout>
                    <Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
                </PatternLayout>
            </File>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
        </Appenders>
        <Loggers>
            <Root level="all">
                <AppenderRef ref="MyCustomLogFile"/>
                <!--<AppenderRef ref="Console"/>-->
            </Root>
        </Loggers>
    </Configuration>

Сохраните этот файл с любым именем где угодно. Я использую Log4j2.xml как имя. Теперь вам понадобится этот файл, который нужно поместить в путь к классам, который вы можете сделать, передав системное свойство при запуске программы следующим образом:

    java -Dlog4j.configurationFile=/path/to/xml/configuration/file/Log4j2.xml MyMainClass

И ты это сделал. Ведение журнала будет сразу на консоли.

Специальные заметки:

  • В файле XML я предоставил 2 приложения: файл и консоль. Вы можете видеть, что вам просто нужно раскомментировать прокомментированный тег AppenderRef, чтобы получить вывод в файле вместо консоли.

  • Вы также можете указать переменную среды как системное свойство. Log4j 2 сначала прочитает файл конфигурации из переменной среды, а затем в аргументе -D, если не найден переменный среды.

Получайте удовольствие от регистрации.: -)

Ответ 3

поместите log4j2.xml файл под src/main/resources. Он работает

Ответ 5

Он существует в пути к классам проекта, и я попытался поместить его в многие другие каталоги.

Где именно? Часто возникает путаница в том, где означает "в пути класса". Это не может быть нигде. Он должен быть в верхнем или стандартном пакете.

src
├── main
│   └── java
│       ├── com
│       │   └── example
│       └── log4j2.xml

Ответ 6

Совет для пользователей eclipse:

Щелкните правой кнопкой мыши по проекту и нажмите "Обновить". Убедитесь, что вы видите файл log4j2.xml в eclipse. (Это решило мою проблему.)

Чтобы быть подробным:

  • Вы не должны добавлять файл для создания пути. (Если вы это сделаете, eclipse предупредит вас об этом)

  • Имя этого файла не отображается в файле .classpath.

  • Я помещаю свой файл log4j2.xml в каталог src/. Он работает.

Ответ 7

Я уверен, что вам нужно записать полное квалифицированное имя класса, сообщения которого вы хотите зарегистрировать - что-то вроде com.application.log4jtest.YourClass. Если это не сработает, попробуйте запустить уровень журнала.

Также - как уведомление - вы также можете написать

Logger logger = LogManager.getLogger(MyClass.class); // omit .getClass()

Ответ 8

У меня была аналогичная проблема. Я поместил файл в папку src, и он сработал. Я не упоминал ни одного имени пакета в файле log4j2.xml.

Ответ 9

У меня была проблема, я попробовал некоторые решения, но только это со мной работало:

Перейдите в web.xml и добавьте этот параметр:

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

Ответ 10

В документации log4j 2: http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

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

но он не работает с classpath. Вместо этого, если мы сохраним его в папке src, тогда он работает.

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

аналогичная проблема упоминается здесь: https://issues.apache.org/jira/browse/LOG4J2-357

Ответ 11

Я также столкнулся с той же проблемой. Я сохранил файл log4j2.xml в переменной System environment.

Имя переменной: sys_logroot Значение переменной: D:\user\gouse

и для меня не созданы журналы.

используйте системную переменную -Dlog4j.configurationFile=path/to/log4j2.xml Смотрите здесь

Это решает мою проблему