it-swarm.com.ru

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

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

310
maximus

Это краткое введение в 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
397
maba

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

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

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

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

70
JDJ

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

  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
    
38
lancerex

Это всего лишь предупреждение.

Фиксация

Это происходит, когда не удается найти файлы конфигурации по умолчанию log4j.properties и log4j.xml и приложение не выполняет явную настройку.

Чтобы это исправить, просто создайте/скопируйте log4j.properties или log4j.xml в ваше местоположение classpath (обычно то же самое, что и файлы 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

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

31
kenorb

В большинстве ответов предлагается, чтобы файл 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
7
Searene

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

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

7
Simulant

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

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

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

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

<build>
       <sourceDirectory> src/main/Java</sourceDirectory>
       <testSourceDirectory> src/test/Java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >
4
belvey

Я думаю, вы должны понимать, где находится файл jar log4j или код 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
Jin Thakur

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

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

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

2
ekjcfn3902039

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

2
Antonio Martin

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

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

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

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

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

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

1
Gangnus

Log4J отображает это предупреждающее сообщение, когда код Log4j Java выполняет поиск, чтобы создать первую строку журнала в вашей программе.

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

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

Если log4J не находит файл log4j.properties или если appender, объявленный в 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!

1
schlebe

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

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

  1. Бежать

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

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

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

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

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

  7. Применять

  8. Бежать

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

1
Varaj Vignesh

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

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

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

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

0
yasin

Моя установка Eclipse не смогла найти log4j.properties при запуске JUnit тестов из Eclipse, хотя файл находился в src/test/resources.

Причина заключалась в том, что Eclipse (или соединитель m2e) не копировал содержимое из src/test/resources в ожидаемую выходную папку target/test-classes - основной причиной было то, что в свойствах проекта в Java Build Path = -> Источник вкладка -> Исходные папки по пути сборки -> src/test/resources, каким-то образом была запись Excluded: **. Я удалил это исключено запись.

Кроме того, я мог бы вручную скопировать src/test/resources/log4j.properties в target/test-classes/log4j.properties.

0
Abdull

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

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

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

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

0
NightWind

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

 import org.Apache.log4j.PropertyConfigurator;

Затем добавьте приведенный ниже код в метод main:

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

Создайте файл по адресу 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
himansug