Конфигурация log4j2 - файл конфигурации log4j2 не найден

91

Недавно я решил научиться пользоваться логгером log4j2. Я загрузил необходимые файлы jar, создал библиотеку, файл конфигурации xml и попытался использовать его. К сожалению, я получаю это заявление в консоли (Eclipse):

ERROR StatusLogger No log4j2 configuration file found. Using default configuration:       logging only errors to the console.

Это мой код класса тестирования:

package log4j.test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Log4jTest
{
    static final Logger logger = LogManager.getLogger(Logger.class.getName());

    public static void main(String[] args) {    
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.fatal("fatal");
    }
}

И мой файл конфигурации xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration package="log4j.test" 
               status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="log4j.test.Log4jTest" level="trace">
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Я пробовал также с xml без <Logger>тегов и спецификацией пакетов и в различных каталогах папок / пакетов, но это не помогло. Теперь мой log4j2.xmlфайл находится прямо в папке проекта в eclipse.

Qbisiek
источник
2
Док саис, он просто должен быть на пути к классам. Это?
Филдор
да, я это пропустил. Извините за глупый вопрос и спасибо :)
Qbisiek

Ответы:

139

Это простой Java-проект eclipse без maven и т. Д.? В этом случае вам нужно будет поместить log4j2.xmlфайл в srcпапку, чтобы можно было найти его в пути к классам. Если вы используете maven, поместите его под src/main/resourcesилиsrc/test/resources

Томаш В
источник
4
Мой герой! У меня был файл конфигурации в пути к классам (я думаю), но его не было в папке src. Я переместил его туда, и теперь он работает!
Шадонинджа
как настроить проект maven? (как maven, потому что я полагаю, что если я помещу 'log4j2.xml' в путь к классам, я буду работать), спасибо за советы :)
Энрике Сан-Мартин
log4j2.xml находится в моем src (проект JavaFX без maven), но не найден .. это оооочень сложно?!?! :(
Эвоки
2
Для переходит в а. sbtlog4j2.xmlsrc/main/resources
Акавалл
я не могу найти этот файл log4j2.xml
Karthiga
32

Вам нужно выбрать одно из следующих решений:

  1. Поместите файл log4j2.xml в каталог ресурсов вашего проекта, чтобы log4j находил файлы по пути к классам.
  2. Используйте системное свойство -Dlog4j.configurationFile = file: /path/to/file/log4j2.xml
Абдулгаффар аль-Лабади
источник
1
-Dlog4j.configurationFileэто то, что мне нужно, поскольку проект, над которым я работаю, не основан на Maven. Потрясающе
Kimchi Man
15

Следовал документации - Apache Log4j2 Configuratoin и Apache Log4j2 Maven при настройке log4j2 с yaml. Согласно документации, требуются следующие зависимости maven:

  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.8.1</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.1</version>
  </dependency>

а также

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <version>2.8.6</version>
</dependency>

Простое добавление их не выбирало конфигурацию и всегда давало ошибку. Способ отладки конфигурации путем добавления -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACEпомог увидеть логи. Позже пришлось загрузить исходный код с помощью Maven, и отладка помогла понять зависимые классы log4j2. Они перечислены в org.apache.logging.log4j.core.config.yaml.YamlConfigurationFactory:

com.fasterxml.jackson.databind.ObjectMapper
com.fasterxml.jackson.databind.JsonNode
com.fasterxml.jackson.core.JsonParser
com.fasterxml.jackson.dataformat.yaml.YAMLFactory

Добавление сопоставления зависимостей для jackson-dataformat-yamlне будет иметь первых двух классов. Следовательно, добавьте jackson-databindзависимость для работы конфигурации yaml:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.6</version>
</dependency>

Вы можете добавить версию, обратившись к Test Dependenciesразделу элемента log4j-apiверсии из репозитория MVN . Например, для версии log4j-api 2.8.1 перейдите по этой ссылке и найдите jackson-databindверсию.

Более того, вы можете использовать приведенный ниже код Java, чтобы проверить, доступны ли классы в пути к классам:

System.out.println(ClassLoader.getSystemResource("log4j2.yml")); //Check if file is available in CP
ClassLoader cl = Thread.currentThread().getContextClassLoader(); //Code as in log4j2 API. Version: 2.8.1
 String [] classes = {"com.fasterxml.jackson.databind.ObjectMapper",
 "com.fasterxml.jackson.databind.JsonNode",
 "com.fasterxml.jackson.core.JsonParser",
 "com.fasterxml.jackson.dataformat.yaml.YAMLFactory"};

 for(String className : classes) {
     cl.loadClass(className);
 }
Джеймс Джитин
источник
4

В дополнение к тому, что написал Томаш В., запустив свое приложение, вы можете использовать настройки:

-Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACE 

для решения большинства проблем с настройкой.

Подробнее см. Часто задаваемые вопросы о Log4j2: как отладить конфигурацию?

Северин Хабданк-Войеводски
источник
3

Eclipse никогда не увидит файл, пока вы не обновите IDE принудительно. Это особенность! Таким образом, вы можете поместить файл по всему проекту, и Eclipse полностью его проигнорирует и выдаст эти ошибки. Нажмите «Обновить» в представлении проекта Eclipse, и тогда все заработает.

Майк Эшби
источник
0

В моем случае мне пришлось поместить его в папку bin моего проекта, даже несмотря на то, что мой путь к классам установлен в папку src. Понятия не имею, почему, но попробовать стоит.

Флориан
источник
Это говорит о том, что проект не распознает, что папка, содержащая вашу конфигурацию, является папкой ресурсов, поэтому он не копирует файл автоматически как часть сборки. Я предлагаю изучить это подробнее, потому что в конечном итоге вы внесете изменение в источник, который не будет скопирован в папку bin, и в конечном итоге потратите много времени на размышления, почему ваше изменение не сработало.
Сара Филлипс