Ответ 1
Хорошо, я решил проблему. Я должен был указать в xml пакет = "myPackage"
Я пытаюсь настроить 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");
И ничего не написано и файл не создается. Когда я отлаживаю код, я вижу, что регистратор является регистратором по умолчанию (консоль).
Хорошо, я решил проблему. Я должен был указать в xml пакет = "myPackage"
На самом деле это прямой процесс. Ниже перечислены два основных класса 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
, если не найден переменный среды.
Получайте удовольствие от регистрации.: -)
поместите log4j2.xml
файл под src/main/resources
. Он работает
вы должны поместить свой log4j2.xml в путь к классам.
или установить системное свойство log4j.configurationFile, чтобы заставить использовать log4j2.xml
Обратитесь к: http://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticConfiguration
Он существует в пути к классам проекта, и я попытался поместить его в многие другие каталоги.
Где именно? Часто возникает путаница в том, где означает "в пути класса". Это не может быть нигде. Он должен быть в верхнем или стандартном пакете.
src
├── main
│ └── java
│ ├── com
│ │ └── example
│ └── log4j2.xml
Совет для пользователей eclipse:
Щелкните правой кнопкой мыши по проекту и нажмите "Обновить". Убедитесь, что вы видите файл log4j2.xml в eclipse. (Это решило мою проблему.)
Чтобы быть подробным:
Вы не должны добавлять файл для создания пути. (Если вы это сделаете, eclipse предупредит вас об этом)
Имя этого файла не отображается в файле .classpath.
Я уверен, что вам нужно записать полное квалифицированное имя класса, сообщения которого вы хотите зарегистрировать - что-то вроде com.application.log4jtest.YourClass
. Если это не сработает, попробуйте запустить уровень журнала.
Также - как уведомление - вы также можете написать
Logger logger = LogManager.getLogger(MyClass.class); // omit .getClass()
У меня была аналогичная проблема. Я поместил файл в папку src, и он сработал. Я не упоминал ни одного имени пакета в файле log4j2.xml.
У меня была проблема, я попробовал некоторые решения, но только это со мной работало:
Перейдите в web.xml и добавьте этот параметр:
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>log4j2.xml</param-value>
</context-param>
В документации 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
Я также столкнулся с той же проблемой. Я сохранил файл log4j2.xml в переменной System environment.
Имя переменной: sys_logroot Значение переменной: D:\user\gouse
и для меня не созданы журналы.
используйте системную переменную -Dlog4j.configurationFile=path/to/log4j2.xml
Смотрите здесь
Это решает мою проблему