Не найдены приложения для регистратора (log4j)?

208

Я поместил 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.

Что означают эти предупреждения? Что представляет собой приложение?

  • 5
    Это кажется предупреждением во время выполнения. Вы уверены, что видите это при компиляции?
  • 5
    Вы пытались посетить URL в последней строке предупреждений?
Показать ещё 3 комментария
Теги:
log4j

20 ответов

253
Лучший ответ

Это Краткое введение в руководство 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
  • 2
    Просто первый шаг в порядке. Цитата из краткого введения в руководство log4j
  • 41
    Для новых встреч ... добавьте файл log4j.properties в src / main / resources, и это предполагает, что у вас есть проект maven. Материал в src / main / resources включен в путь к классам.
Показать ещё 3 комментария
49

Похоже, вам нужно добавить местоположение вашего файла log4j.properties в Classpath в Eclipse.

Убедитесь, что ваш проект открыт в Eclipse, затем нажмите "Выполнить" в верхней части Eclipse и щелкните по следующему:

  • Run
  • Конфигурации запуска
  • Путь к классу (вкладка)
  • Пользовательские записи
  • Дополнительно (кнопка справа)
  • Добавить папки
  • затем перейдите к папке, содержащей файл log4j.properties.
  • Применить
  • Run

Сообщение об ошибке больше не должно появляться.

  • 0
    Предупреждающие сообщения не отображаются, но журналы не записываются в нужном месте.
23

Быстрое решение:

  • добавить код в главную функцию:

    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
    
  • 0
    Поместите файл log4j.properties в каталог ресурсов, например, src / test / resource
19

Это просто предупреждение.

Крепление

Это происходит, когда файлы конфигурации по умолчанию 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

Apache Solr

Если вы используете 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

См. также:

7

Вы используете Logger в своем коде для регистрации сообщения. Appender - это объект, прикрепленный к Logger для записи сообщения в конкретную цель. Существует FileAppender для записи в текстовые файлы или ConsoleAppender для записи в Консоль. Чтобы получить дополнительную информацию, вам нужно показать код программы Logger и Appender.

прочитайте учебник для лучшего понимания взаимодействия Logger и Appender.

5

Как объяснялось ранее, существует 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");

Убедитесь, что вы создали нужную папку для хранения файлов журнала.

  • 0
    У меня была такая же проблема, и я использовал BasicConfigurator.configure (); в методе main, и теперь код выполняется правильно.
3

Убедитесь, что файл свойств установлен правильно. И опять же, похоже, что компилятор не может найти файл свойств, вы можете установить его в pom (только при использовании проекта maven).

<build>
       <sourceDirectory> src/main/java</sourceDirectory>
       <testSourceDirectory> src/test/java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >
  • 0
    Это! Я потратил часы, чтобы найти ответ. Мой код дела хорошо работает в Linux, но имеет эту ошибку в Windows (то же самое NB IDE), и все вышеупомянутые решения не работают!
3

В большинстве ответов здесь указано, что файл 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
  • 0
    Тот факт, что log4j считает, что «невозможно найти файл» и «неполная спецификация в файле» - это одна и та же ошибка, тратит время.
  • 0
    Для меня это лучший ответ. Я голосую и добавил несколько объяснений в ваш ответ.
3

Я думаю, вы должны понять, где файл 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/

3

Я получаю ту же ошибку. Вот проблема, которая приводит к этому сообщению об ошибке:

Я создаю некоторые объекты, которые используют 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
  • 0
    Огромное спасибо!!! Все просто предполагают Spring или Tomcat, или что-то еще для инициализации конфигурации.
2

Другая причина, по которой это может произойти (в RCP4), заключается в том, что вы используете несколько фреймворков регистрации в своем целевом файле. В качестве примера это произойдет, если вы используете комбинацию slf4j, log4j и ch.qos.logback.slf4j на вкладке содержимого целевых файлов.

2

В моем случае ошибкой был флаг " аддитивность". Если это "ложный" для вас корневой пакет проекта, тогда дочерние пакеты не будут иметь appender, и вы увидите сообщение " appender not found".

1
Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "WARN");
PropertyConfigurator.configure(prop);
1

Я столкнулся с той же проблемой, когда я использую 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");
1

Причиной может быть отсутствие слова static в некоторых:

final static Logger logging = Logger.getLogger(ProcessorTest.class);

Если я сделаю logger поле экземпляра, я получаю именно это предупреждение:

No appenders could be found for logger (org.apache.kafka.producer.Sender)

Что еще хуже, предупреждение указывает не на ProcessorTest, где ошибка, а на совершенно другой класс (Отправитель) как на источник проблем. Этот класс имеет правильный регистратор заданий и не нуждается в каких-либо изменениях! Мы могли бы искать проблему на века!

1

Убедитесь, что ваш проект открыт в Eclipse, затем нажмите "Выполнить" в верхней части Eclipse и щелкните по следующему:

  • Run

  • Запуск конфигураций

  • Путь к классу (вкладка)

  • Записи пользователя

  • добавить jar справа

  • добавить файл журнала log4j

  • Применить

  • Run

Сообщение об ошибке больше не должно появляться.

1

Я столкнулся с этой проблемой при попытке создать исполняемую банку с 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>
0

Если 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...
}
0

Моя установка 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.

-3

В java eclipse скопируйте папку conf_ref в conf.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню