Я поместил log4j в свой путь сборки, но при запуске приложения я получаю следующее сообщение:
log4j:WARN No appenders could be found for logger (dao.hsqlmanager).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Что означают эти предупреждения? Что представляет собой приложение?
Это Краткое введение в руководство log4j немного устарело, но все еще актуально.
Это руководство предоставит вам некоторую информацию о том, как использовать регистраторы и приложения.
Просто, чтобы добиться успеха, вы можете сделать два простых подхода.
Сначала нужно просто добавить эту строку к вашему основному методу:
BasicConfigurator.configure();
Второй подход заключается в том, чтобы добавить этот стандартный log4j.properties
(взятый из вышеупомянутого руководства) файл к вашему пути к классам:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Похоже, вам нужно добавить местоположение вашего файла log4j.properties
в Classpath в Eclipse.
Убедитесь, что ваш проект открыт в Eclipse, затем нажмите "Выполнить" в верхней части Eclipse и щелкните по следующему:
Сообщение об ошибке больше не должно появляться.
Быстрое решение:
добавить код в главную функцию:
String log4jConfPath = "/path/to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);
создайте файл с именем log4j.properties в /path/to
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n
Это просто предупреждение.
Это происходит, когда файлы конфигурации по умолчанию log4j.properties
и log4j.xml
не могут быть найдены, и приложение не выполняет явной конфигурации.
Чтобы исправить это, просто создайте/скопируйте log4j.properties
или log4j.xml
в свое местоположение в пути к классам (обычно это то же самое, что и файлы jar).
Необязательно задайте опцию java: -Dlog4j.configuration=file:///path/to/log4j.properties
.
log4j
используетThread.getContextClassLoader().getResource()
для поиска файлов конфигурации по умолчанию и напрямую не проверяет файловую систему. Знание соответствующего места размещенияlog4j.properties
илиlog4j.xml
требует понимания стратегии поиска используемого загрузчика классов.log4j
не предоставляет конфигурацию по умолчанию, поскольку вывод на консоль или файловая система может быть запрещен в некоторых средах.
Для отладки вы можете попробовать использовать параметр -Dlog4j.debug=true
.
log4j.properties
Пример конфигурации log4j.properties
:
# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
Вот еще один файл конфигурации, в котором используется несколько приложений:
log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Если вы используете Solr, скопируйте <solr>/example/resources/log4j.properties
в местоположение в пути к классам.
Пример конфигурации log4j.properties
из Solr выглядит следующим образом:
# Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n
#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9
#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n
log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN
# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF
См. также:
Вы используете Logger
в своем коде для регистрации сообщения. Appender
- это объект, прикрепленный к Logger
для записи сообщения в конкретную цель. Существует FileAppender
для записи в текстовые файлы или ConsoleAppender
для записи в Консоль. Чтобы получить дополнительную информацию, вам нужно показать код программы Logger и Appender.
прочитайте учебник для лучшего понимания взаимодействия Logger и Appender.
Как объяснялось ранее, существует 2 подхода
Сначала нужно просто добавить эту строку к вашему основному методу:
BasicConfigurator.configure();
Второй подход заключается в том, чтобы добавить этот стандартный файл log4j.properties в ваш путь к классам:
При использовании второго подхода вам необходимо убедиться, что вы правильно инициализировали файл, Например.
Properties props = new Properties();
props.load(new FileInputStream("log4j property file path"));
props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");
Убедитесь, что вы создали нужную папку для хранения файлов журнала.
Убедитесь, что файл свойств установлен правильно. И опять же, похоже, что компилятор не может найти файл свойств, вы можете установить его в pom (только при использовании проекта maven).
<build>
<sourceDirectory> src/main/java</sourceDirectory>
<testSourceDirectory> src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>resources</directory>
</resource>
</resources>
</build >
В большинстве ответов здесь указано, что файл log4j.properties
должен быть размещен в нужном месте (для проекта maven он должен быть расположен в src/main/resources
)
Но для меня проблема в том, что мой log4j.properties
настроен неправильно. Здесь образец, который работает для меня, вы можете попробовать сначала.
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Я думаю, вы должны понять, где файл log4j jar или код Java ищет файлы конфигурации log4j.
src/main/resources/log4j.properties
- путь Eclipse.
Поместите их в нужное место, чтобы вам не пришлось жестко кодировать абсолютный путь в коде.
Прочитайте мою статью и образец решения для этого http://askyourquestions.info/2016/03/27/how-to-see-where-the-log-is-logger-in-slf4j/
Я получаю ту же ошибку. Вот проблема, которая приводит к этому сообщению об ошибке:
Я создаю некоторые объекты, которые используют Logger, прежде чем настраивать log4j:
Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);
Решение: Настройте log4j в начале в основном методе:
PropertyConfigurator.configure(xmlLog4JConfigFile);
// or BasicConfigurator.configure(); if you dont have a config file
Другая причина, по которой это может произойти (в RCP4), заключается в том, что вы используете несколько фреймворков регистрации в своем целевом файле. В качестве примера это произойдет, если вы используете комбинацию slf4j, log4j и ch.qos.logback.slf4j на вкладке содержимого целевых файлов.
В моем случае ошибкой был флаг " аддитивность". Если это "ложный" для вас корневой пакет проекта, тогда дочерние пакеты не будут иметь appender, и вы увидите сообщение " appender not found".
Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);
Я столкнулся с той же проблемой, когда я использую log4j2. Моя проблема вызвана неправильной зависимой библиотекой:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>runtime</scope>
</dependency>
Вместо этого я должен использовать:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<scope>runtime</scope>
</dependency>
В моем случае у меня есть log4j2.xml, определенный в моем каталоге "resources", и указанный для его использования:
System.setProperty("log4j.configurationFile", "log4j2.xml");
Причиной может быть отсутствие слова static
в некоторых:
final static Logger logging = Logger.getLogger(ProcessorTest.class);
Если я сделаю logger поле экземпляра, я получаю именно это предупреждение:
No appenders could be found for logger (org.apache.kafka.producer.Sender)
Что еще хуже, предупреждение указывает не на ProcessorTest
, где ошибка, а на совершенно другой класс (Отправитель) как на источник проблем. Этот класс имеет правильный регистратор заданий и не нуждается в каких-либо изменениях! Мы могли бы искать проблему на века!
Убедитесь, что ваш проект открыт в Eclipse, затем нажмите "Выполнить" в верхней части Eclipse и щелкните по следующему:
Run
Запуск конфигураций
Путь к классу (вкладка)
Записи пользователя
добавить jar справа
добавить файл журнала log4j
Применить
Run
Сообщение об ошибке больше не должно появляться.
Я столкнулся с этой проблемой при попытке создать исполняемую банку с maven в intellij 12. Оказалось, что из-за того, что файл манифеста Java не содержит путь к классу, файл свойств log4j не может быть найден на корневом уровне (где файл jar был выполнен из.)
FYI Я получил регистратор следующим образом:
Logger log = LogManager.getLogger(MyClassIWantedToLogFrom.class);
И я смог заставить его работать с файлом pom, который включал это:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.mainPackage.mainClass</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path> <!-- need to add current directory to classpath properties files can be found -->
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
Если log4j.properties
действительно находится в пути к классам, вы используете Spring Boot для создания файла WAR для развертывания на сервере приложений, вы опускаете файл web.xml
в пользу Spring Boot autoconfigure и вы не получаете никаких сообщений журнала, вам нужно явно настроить Log4j. Предполагая, что вы используете Log4j 1.2.x:
public class AppConfig extends SpringBootServletInitializer {
public static void main( String[] args ) {
// Launch the application
ConfigurableApplicationContext context = SpringApplication.run( AppConfig.class, args );
}
@Override
protected SpringApplicationBuilder configure( SpringApplicationBuilder application ) {
InputStream log4j = this.getClass().getClassLoader().getResourceAsStream("log4j.properties");
PropertyConfigurator.configure(log4j);
return application;
}
// Other beans as required...
}
Моя установка Eclipse не смогла найти log4j.properties
при запуске тестов JUnit из Eclipse, хотя файл находился в src/test/resources
.
Причина заключалась в том, что Eclipse (или соединитель m2e) не копировал содержимое из src/test/resources
в ожидаемую выходную папку target/test-classes
- основная причина заключалась в том, что в свойствах проекта в пути Java Build Path → Source → Исходные папки на пути сборки → src/test/resources, так или иначе появилась запись Excluded: **
. Я удалил эту исключенную запись.
В качестве альтернативы я мог бы вручную скопировать src/test/resources/log4j.properties
в target/test-classes/log4j.properties
.
В java eclipse скопируйте папку conf_ref в conf.