Не найдены приложения для регистратора (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.

Что означают эти предупреждения? Что здесь за аппендант?

32 ответа

Решение

Это краткое введение в руководство по log4j немного устарело, но все еще действует.

Это руководство даст вам некоторую информацию о том, как использовать регистраторы и приложения.


Просто чтобы начать, у вас есть два простых подхода.

Во-первых, просто добавьте эту строку в ваш основной метод:

BasicConfigurator.configure();

Второй подход - добавить этот стандарт. log4j.properties (взято из вышеупомянутого руководства) файл к вашему classpath:

# 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 и нажмите на следующее:

  1. Бежать
  2. Запустить конфигурации
  3. Classpath (вкладка)
  4. Записи пользователя
  5. Дополнительно (кнопка справа)
  6. Добавить папки
  7. затем перейдите в папку, в которой находится файл log4j.properties
  8. Применять
  9. Бежать

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

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

  1. добавить код в основную функцию:

    String log4jConfPath = "/path/to/log4j.properties";
    PropertyConfigurator.configure(log4jConfPath);
    
  2. создайте файл с именем 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's 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

Смотрите также:

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

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

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

Прежде всего: создайте файл 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

Поместите его в src/main/resources/

После этого используйте эти 2 зависимости:

<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>

В файл POM необходимо добавить эту финальную зависимость:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

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

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

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

Вы используете Logger в вашем коде, чтобы войти сообщение. Appender Объект добавлен к Logger написать сообщение для конкретной цели. Есть FileAppender записывать в текстовые файлы или ConsoleAppender написать на консоль. Вам нужно показать свой код настройки Logger и Appender для получения дополнительной помощи.

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

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

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

Я думаю, вы должны понимать, где файл jar log4j или код Java ищет файлы конфигурации log4j.

src/main/resources/log4j.properties это путь затмения. Разместите их в правильном месте, чтобы вам не приходилось жестко кодировать абсолютный путь в коде.

Прочитайте мою статью и пример решения для этого 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

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

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

На мой взгляд, причина была в другой, а сообщение об ошибке вводило в заблуждение.

Имея только это в моем build.gradle, он будет жаловаться на отсутствие slf4j в начале журнала, но все равно будет записывать вещи, хотя и в плохом формате:

    compile 'log4j:log4j:1.2.17'

Добавление этой зависимости привело бы к появлению у меня обсуждаемого сообщения об ошибке "Не удалось найти никаких приложений", хотя я определил их в src/main/java/log4j.properties:

    compile 'log4j:log4j:1.2.17'
    compile 'org.slf4j:slf4j-log4j12:1.7.25'

Наконец, добавление следующей зависимости (о которой я только догадался, скопировав ее из другого проекта) разрешило проблему:

    compile 'log4j:log4j:1.2.17'
    compile 'org.slf4j:slf4j-log4j12:1.7.25'
    compile 'commons-logging:commons-logging:1.2'

Не знаю почему, но с этим все работает. Есть какие-нибудь идеи по этому поводу?

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 заявитель объявлен в нижнем корпусе в 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!

Если вы используете Eclipse, и эта проблема возникла из ниоткуда после того, как все работало нормально, попробуйте перейти на Project - Clean - Clean.

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

Я получал это сообщение об ошибке в IntelliJ при попытке запустить модульные тесты. У меня были одновременно открыты Eclipse и IntelliJ, что могло вызвать эту проблему. После того, как я закрыл обе IDE и запустил сборку из командной строки maven, ошибка исчезла.

Причиной может быть отсутствие слова 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 и нажмите на следующее:

  1. Бежать

  2. Запустить конфигурации

  3. Classpath (вкладка)

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

  5. добавить банку справа

  6. добавить файл jar log4j

  7. Применять

  8. Бежать

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

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

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

Я столкнулся с этой проблемой при попытке создать исполняемый jar-файл с maven в intellij 12. Оказалось, что из-за того, что файл манифеста java не содержит пути к классам, файл свойств log4j не может быть найден на корневом уровне (где файл jar был выполнен из.)

К вашему сведению, я получал регистратор, как это:

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 в пути сборки Java, я добавляю в него mahout_h2o, когда столкнулся с этой проблемой в проекте mahout с использованием eclipse, это работает!

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

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

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

Если log4j.properties действительно находится на пути к классам, вы используете Spring Boot для создания файла WAR для развертывания на сервере приложений, вы пропускаете web.xml файл в пользу автоконфигурации Spring Boot, и вы не получаете никаких сообщений журнала, вам нужно явно настроить 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...
}

Рассмотрим аргумент log4j JVM Dlog4j.configuration

В основном:

Добавьте аргумент JVM, указывающий на файл конфигурации log4j. Синтаксис такой:

java [ options ] -jar file.jar [ arguments ]

Пример реальной командной строки выглядит примерно так:

java -Dlog4j.configuration=conf/log4j.xml -jar myJarFile.jar myArg1 myArg2

Для пользователей IntelliJ IDE:

1.Run/Debug Configurations
2.Edit configurations...
3.VM options
4.Enter the same value also starting with "-D"

Подсказки:

1. Пользователи Eclipse IDE найдут эквивалентный подход

2. Что касается редактора конфигурации запуска / отладки, очень вероятно, что в начале времени вашего конкретного исполняемого файла там нет. В зависимости от размера проекта, над которым вы сейчас работаете, может быть неприятно перемещаться по каталогам, чтобы найти его. Меньше хлопот, если вы просто запустите / выполните файл (нажмите кнопку воспроизведения) один раз, прежде чем приступить к запуску / отладке конфигурации, независимо от результата выполнения.

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

Решение на этом сайте работало для меня 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

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

Другие вопросы по тегам