Конфігурація 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.


2
Док Саїс, він просто повинен бути на шляху до класів. Є це?
Fildor

так, я пропустив це. Вибачте за дурне запитання та дякую :)
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 Project без maven), але його не знайдено .. це оооочень складне?!?! :(
Ewoks,

2
Для переходить в а. sbtlog4j2.xmlsrc/main/resources
Акавалл

я не можу знайти цей файл log4j2.xml
Картіга

32

Вам потрібно вибрати одне з таких рішень:

  1. Помістіть файл log4j2.xml у каталог ресурсів у своєму проекті, щоб log4j знаходив файли за маршрутом класу.
  2. Використовуйте системну властивість -Dlog4j.configurationFile = файл: /path/to/file/log4j2.xml

1
-Dlog4j.configurationFileце те, що мені потрібно, оскільки проект, над яким я працюю, не базується на Maven. Чудово
Кімчі Ман

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 . Наприклад, версія 2.8.1 log4j-api, перейдіть за цим посиланням і знайдіть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

На додаток до того, що написав Tomasz W, запустивши вашу програму, ви могли використовувати налаштування:

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

щоб отримати більшість проблем із конфігурацією.

Детальніше див. У розділі поширених запитань Log4j2: Як мені налагодити конфігурацію?


3

Eclipse ніколи не побачить файл, доки ви не примусите оновити IDE. Це особливість! Таким чином, ви можете розмістити файл у всьому проекті, і Eclipse повністю його проігнорує та видасть ці помилки. Натисніть оновлення у поданні проекту Eclipse, і тоді воно працює.


0

У моєму випадку мені довелося помістити його в папку bin мого проекту, навіть той факт, що мій шлях до класу встановлений у папку src. Я не уявляю, чому, але варто спробувати.


Це свідчить про те, що проект не визнає, що папка, що містить вашу конфігурацію, є папкою ресурсу, тому він не копіює файл автоматично як частину збірки. Я б запропонував вивчити це далі, тому що врешті-решт ви внесете зміни до джерела, яке не буде скопійовано до папки bin, і в кінцевому підсумку витратите віки, дивуючись, чому ваші зміни не спрацювали.
Сара Філліпс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.