Konfiguracja Log4j2 - nie znaleziono pliku konfiguracyjnego log4j2

91

Ostatnio postanowiłem nauczyć się obsługi rejestratora log4j2. Pobrałem wymagane pliki jar, utworzyłem bibliotekę, plik konfiguracyjny xml i próbowałem go użyć. Niestety otrzymałem to oświadczenie w konsoli (Eclipse):

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

Oto kod mojej klasy testowej:

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");
    }
}

I mój plik konfiguracyjny 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>

Próbowałem także z xml bez <Logger>tagów i specyfikacji pakietu oraz w różnych katalogach / pakietach, ale to nie pomogło. Teraz mój log4j2.xmlplik znajduje się bezpośrednio w folderze projektu w eclipse.

Qbisiek
źródło
2
Doc sais, to po prostu musi być na ścieżce klasy. Czy to jest?
Fildor
tak, przegapiłem to. Przepraszam za głupie pytanie i dzięki :)
Qbisiek

Odpowiedzi:

139

Czy to prosty projekt java zaćmienia bez maven itp.? W takim przypadku będziesz musiał umieścić log4j2.xmlplik w srcfolderze, aby móc go znaleźć w ścieżce klas. Jeśli używasz maven, umieść go pod src/main/resourceslubsrc/test/resources

Tomasz W
źródło
4
Mój bohater! Miałem plik konfiguracyjny w ścieżce klas (chyba), ale nie było go w folderze src. Przeniosłem go tam i teraz działa!
Shadoninja
jak konfigurować z projektem maven? (jak w maven sposób, ponieważ przypuszczam, że jeśli umieściłbym „log4j2.xml” pod ścieżką klas, to bym pracował), dzięki za wskazówki :)
Enrique San Martín
log4j2.xml znajduje się w moim src (projekt JavaFX bez maven), ale nie został znaleziony… czy to takie skomplikowane?!?! :(
Ewoks
2
Bo sbtteż log4j2.xmlwchodzi w src/main/resources.
Akavall
Nie mogę znaleźć tego pliku log4j2.xml
Karthiga
32

Musisz wybrać jedno z następujących rozwiązań:

  1. Umieść plik log4j2.xml w katalogu zasobów w projekcie, aby log4j mógł zlokalizować pliki w ścieżce klasy.
  2. Użyj właściwości systemowej -Dlog4j.configurationFile = file: /path/to/file/log4j2.xml
Abdulghaffar Al-Labadi
źródło
1
-Dlog4j.configurationFilejest tym, czego potrzebowałem, ponieważ projekt, nad którym pracuję, nie jest oparty na Mavenie. Niesamowite
Kimchi Man
15

Korzystałem z dokumentacji - Apache Log4j2 Configuratoin i Apache Log4j2 Maven w konfiguracji log4j2 z yaml. Zgodnie z dokumentacją wymagane są następujące zależności 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>

i

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

Samo dodanie ich nie wybrało konfiguracji i zawsze powodowało błąd. Sposób debugowania konfiguracji poprzez dodanie -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACEpomógł w obejrzeniu logów. Później trzeba było pobrać źródło za pomocą Mavena, a debugowanie pomogło w zrozumieniu klas zależnych log4j2. Są one wymienione w 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

Dodanie mapowania zależności dla jackson-dataformat-yamlnie będzie miało pierwszych dwóch klas. Dlatego dodaj jackson-databindzależność, aby uruchomić konfigurację yaml:

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

Możesz dodać wersję, odwołując się do Test Dependenciessekcji log4j-apielementu wersji z repozytorium MVN . Np. W przypadku wersji 2.8.1 log4j-api, przejdź do tego linku i znajdź jackson-databindwersję.

Ponadto możesz użyć poniższego kodu Java, aby sprawdzić, czy klasy są dostępne w ścieżce klas:

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);
 }
James Jithin
źródło
4

Oprócz tego, co napisał Tomasz W, uruchamiając swoją aplikację można było skorzystać z ustawień:

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

aby uzyskać większość problemów z konfiguracją.

Aby uzyskać szczegółowe informacje, zobacz Często zadawane pytania dotyczące Log4j2: Jak debugować konfigurację?

Seweryn Habdank-Wojewódzki
źródło
3

Eclipse nigdy nie zobaczy pliku, dopóki nie wymusisz odświeżenia IDE. To cecha! Możesz więc umieścić plik w całym projekcie, a Eclipse zignoruje go całkowicie i wyrzuci te błędy. Naciśnij przycisk odświeżania w widoku projektu Eclipse, a potem działa.

Mike Ashby
źródło
0

W moim przypadku musiałem umieścić go w folderze bin mojego projektu, nawet jeśli moja ścieżka klas jest ustawiona na folder src. Nie mam pojęcia dlaczego, ale warto spróbować.

Florian
źródło
Sugeruje to, że projekt nie rozpoznaje, że folder zawierający konfigurację jest folderem zasobów, więc nie kopiuje pliku automatycznie w ramach kompilacji. Proponuję przyjrzeć się temu dokładniej, ponieważ w końcu dokonasz zmiany w źródle, które nie zostanie skopiowane do folderu bin, i skończysz spędzając całe wieki na zastanawianiu się, dlaczego Twoja zmiana nie zadziałała.
Sarah Phillips