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

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

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

Ответ 1

Это Краткое введение в руководство 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.properties в Classpath в Eclipse.

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

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

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

Ответ 3

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

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

    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
    

Ответ 4

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

Крепление

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

См. также:

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Большинство ответов здесь предполагает, что файл 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

Ответ 8

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

Я создаю некоторые объекты, которые используют 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

Ответ 9

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

<build>
       <sourceDirectory> src/main/java</sourceDirectory>
       <testSourceDirectory> src/test/java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >

Ответ 10

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

Ответ 11

Добавьте следующее в качестве первого кода:

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

Ответ 12

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

Ответ 13

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

Ответ 14

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

Ответ 15

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

  • Run

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

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

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

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

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

  • Применить

  • Run

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

Ответ 16

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

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

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

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

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

Ответ 17

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

Ответ 18

Log4J отображает это предупреждение при поиске Java-кода Log4j для создания первой строки журнала в вашей программе.

На данный момент Log4j делает 2 вещи

  1. это поиск, чтобы найти файл log4j.properties
  2. это поиск, чтобы создать экземпляр определителя в log4j.properties

Если log4J не находит файл log4j.properties или если заявитель, объявленный в log4j.rootlogger, не определен где-либо еще в файле log4j.properties отображается предупреждающее сообщение.

ВНИМАНИЕ: содержимое файла свойств должно быть правильным.

Следующее содержание НЕ является правильным

log4j.rootLogger=file

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false

потому что file appender объявлен в LOWER-CASE в операторе log4j.rootlogger и определен в операторе log4j.appender с помощью UPPER-CASE!

Правильный файл будет

log4j.rootLogger=FILE

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=c:/Trace/MsgStackLogging.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%m%n
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.FILE.Threshold=debug
log4j.appender.FILE.Append=false

Если используется MAVEN, вы должны поместить файлы log4j.properties в src/main/resources и запустить сборку MAVEN.

Файл Log4j.properties затем копируется в папку target/classes.

Log4J использует файл log4j.properties, найденный в target/classes !

Ответ 19

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

Ответ 20

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

Ответ 21

Может быть, добавьте соответствующий проект, содержащий log4j в пути сборки Java, я добавляю в него mahout_h2o, когда столкнулся с этой проблемой в проекте mahout с использованием eclipse, это работает!

Ответ 22

если вы работаете вместе со многими проектами, вы можете столкнуться с проблемой стиля.

* у вас должен быть один файл lof4j.properties, и этот файл включен в свойства журнала другого проекта.

* Кроме того, вы можете попытаться поместить файлы свойств log4j в путь src, когда проект работает под управлением ОС Linux, библиотеки libs другого проекта и файлы log4.properties могут находиться в одной папке в папке на пути к классам.

Ответ 23

Первый импорт:

 import org.apache.log4j.PropertyConfigurator;

Затем добавьте следующий код в метод main:

String log4jConfPath ="path to/log4j.properties";
PropertyConfigurator.configure(log4jConfPath);

Создайте файл по пути к нему и добавьте приведенный ниже код в этот файл.

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

Ответ 24

Решение на этом сайте работало для меня https://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/. Теперь я не вижу никаких предупреждений от log4j

Я помещаю это в файл log4j.properties, который я помещаю в src/main/resources

# This sets the global logging level and specifies the appenders
log4j.rootLogger=INFO, theConsoleAppender

# settings for the console appender
log4j.appender.theConsoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.theConsoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.theConsoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

Ответ 25

У меня тоже была эта пробема. Я просто забыл пометить каталог ресурсов в IntelliJ IDEA

  1. Щелкните правой кнопкой мыши на вашем каталоге
  2. Отметить каталог как
  3. Корень ресурсов

Ответ 26

Я столкнулся с той же проблемой, когда пытался запустить тестовый класс JUnit.

Проблема устранена после того, как я вручную добавил файл log4j.properties в папку src/test/resources.

Добавление приведенного ниже кода в файл log4j.properties решило проблему:

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# 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

Ответ 27

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