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");

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


person Lee    schedule 06.02.2013    source источник


Ответы (12)


На самом деле это прямой процесс. Ниже приведены два основных класса 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, если переменная среды не найдена.

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

person Manvendra SK    schedule 08.08.2014

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

person Ramachandraiah Nikadi    schedule 01.04.2015
comment
Добавляет ли это что-то, чего нет в 9 других ответах? - person TZHX; 01.04.2015
comment
Да, это дает точное место для размещения файла log4j2.xml. - person Ramachandraiah Nikadi; 01.04.2015

вы должны поместить свой log4j2.xml в путь к классам.

или установите системное свойство «log4j.configurationFile», чтобы заставить использовать ваш log4j2.xml

См.: http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration

person ldelucio    schedule 06.02.2013
comment
Да, я это читал и помещал туда (по крайней мере, я так думаю). Пожалуйста, прочитайте комментарий, который я написал wolfcastle. Спасибо - person Lee; 07.02.2013
comment
к сожалению, этих двух правил недостаточно во многих (простых) случаях - person Francois; 16.07.2015

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

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

src
├── main
│   └── java
│       ├── com
│       │   └── example
│       └── log4j2.xml
person wolfcastle    schedule 06.02.2013
comment
Привет, я использую netbeans, и путь к классам выглядит так: ProjectName\build\classes\ProjectName\log4j2.xml Журнал xml находится в каталоге всех остальных файлов .class. И я вижу, что это путь к классу, потому что он прописан в свойствах проекта: -build.classes.dir=${build.dir}/classes - person Lee; 07.02.2013
comment
У меня сработало в стандартных настройках модуля maven, спасибо. - person hiergiltdiestfu; 11.07.2015
comment
Файл @wolfcastle log4j2.xml в моем проекте eclipse находится в папке src, однако log4j по-прежнему не может его обнаружить. Любое предложение? - person Ketu; 05.02.2016

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

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

Чтобы быть многословным:

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

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

  • Я поместил свой log4j2.xml в каталог src/. Оно работает.
person fstang    schedule 09.11.2013
comment
Я поместил свой log4j2.xml в каталог src/. Оно работает. СПАСИБО! - person KisnardOnline; 22.03.2020

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

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

Logger logger = LogManager.getLogger(MyClass.class); // omit .getClass()
person Joshua    schedule 06.02.2013
comment
Пробовал.. пока ничего. Это должно быть что-то с classpath.. Но я не могу понять, что. - person Lee; 07.02.2013

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

person TechCrunch    schedule 13.09.2013

В документации 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

person Zubin Shah    schedule 30.10.2013

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

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

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>
person Trinity RX    schedule 19.05.2014

Хорошо, я решил проблему. Мне пришлось указать в xml package="myPackage"

person Lee    schedule 07.02.2013
comment
Вы имеете в виду packages как атрибут корневого элемента configuration? Вот так <?xml version="1.0" encoding="UTF-8"?> <configuration name="myproject" packages="my.package" monitorInterval="30"><!-- ... --></configuration> - person Manu; 20.08.2013

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

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

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

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

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

person Mohammad Gouse    schedule 26.02.2015

У меня была та же ошибка «ОШИБКА StatusLogger. Не найден файл конфигурации log4j2. Использование конфигурации по умолчанию: вывод на консоль только ошибок». сообщение снова и снова. Это сводило меня с ума. Файл log4j2.xml был правильно размещен в src/main/resources, как я уже делал в тысячах проектов раньше.

Решение в моем случае состояло в том, чтобы удалить ‹packaging›pom‹/packaging› из корня pom.xml. упаковка pom приводит к тому, что содержимое src/main/resources не копируется в target/classes.

Удачного ведения журнала для всех, у кого такая же основная причина.

person teeny2000    schedule 16.10.2018