Configurazione Log4j2: nessun file di configurazione log4j2 trovato


91

Ultimamente ho deciso di imparare a usare il logger log4j2. Ho scaricato i file jar richiesti, la libreria creata, il file di configurazione xml e ho provato a usarlo. Sfortunatamente ottengo questa dichiarazione in console (Eclipse):

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

Questo è il codice della mia classe di test:

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

E il mio file di configurazione 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>

Ho provato anche con xml senza <Logger>tag e specifica del pacchetto e in varie cartelle / directory dei pacchetti, ma non ha aiutato. Ora il mio log4j2.xmlfile si trova direttamente nella cartella del progetto in eclipse.


2
Il documento dice, deve solo essere sul classpath. È?
Fildor

sì, mi è mancato. Scusa per la domanda stupida e grazie :)
Qbisiek

Risposte:


139

È un semplice progetto Java Eclipse senza Maven ecc.? In tal caso dovrai mettere il log4j2.xmlfile nella srccartella per poterlo trovare nel classpath. Se usi Maven mettilo sotto src/main/resourcesosrc/test/resources


4
Mio eroe! Avevo il file di configurazione nel classpath (credo), ma non era nella cartella src. L'ho spostato lì e ora funziona!
Shadoninja

come si configura con un progetto maven? (come il modo Maven perché suppongo che se inserissi un 'log4j2.xml' sotto il classpath lavorerei), grazie per i suggerimenti :)
Enrique San Martín

log4j2.xml è nel mio src (JavaFX Project without maven) ma non è stato trovato .. è davvero complicato?!?! :(
Ewoks

2
Anche per sbtl' log4j2.xmlentrata src/main/resources.
Akavall,

Non riesco a trovare questo file log4j2.xml
Karthiga

32

Devi scegliere una delle seguenti soluzioni:

  1. Metti il ​​file log4j2.xml nella directory delle risorse nel tuo progetto in modo che log4j localizzi i file nel percorso di classe.
  2. Usa proprietà di sistema -Dlog4j.configurationFile = file: /path/to/file/log4j2.xml

1
-Dlog4j.configurationFileè ciò di cui avevo bisogno, dato che il progetto su cui sto lavorando non è basato su Maven. Fantastico
Kimchi Man

15

Stavo seguendo le documentazioni: Apache Log4j2 Configuratoin e Apache Log4j2 Maven nella configurazione di log4j2 con yaml. Secondo la documentazione, sono richieste le seguenti dipendenze 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>

e

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

La semplice aggiunta di questi non ha scelto la configurazione e ha sempre dato un errore. Il modo di eseguire il debug della configurazione con l'aggiunta di -Dorg.apache.logging.log4j.simplelog.StatusLogger.level=TRACEaiuti nella visualizzazione dei log. Successivamente ha dovuto scaricare il sorgente utilizzando Maven e il debug ha aiutato a comprendere le classi dipendenti di log4j2. Sono elencati in 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

L'aggiunta della mappatura delle dipendenze per jackson-dataformat-yamlnon avrà le prime due classi. Quindi, aggiungi la jackson-databinddipendenza per far funzionare la configurazione di yaml:

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

È possibile aggiungere la versione facendo riferimento alla Test Dependenciessezione log4j-apidell'elemento della versione da MVN Repository . Ad esempio, per la versione 2.8.1 di log4j-api, fare riferimento a questo collegamento e individuare la jackson-databindversione.

Inoltre, puoi utilizzare il seguente codice Java per verificare se le classi sono disponibili nel classpath:

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


3

Eclipse non vedrà mai un file fino a quando non si forza un aggiornamento dell'IDE. È una caratteristica! Quindi puoi mettere il file in tutto il progetto ed Eclipse lo ignorerà completamente e genererà questi errori. Premi Aggiorna nella vista del progetto Eclipse e poi funziona.


0

Nel mio caso ho dovuto metterlo nella cartella bin del mio progetto anche il fatto che il mio classpath sia impostato sulla cartella src. Non ho idea del perché, ma vale la pena provare.


Ciò suggerisce che il progetto non riconosce che la cartella contenente la configurazione è una cartella di risorse, quindi non copia automaticamente il file come parte della build. Suggerirei di esaminare ulteriormente questo aspetto perché alla fine apporterai una modifica alla fonte che non verrà copiata nella cartella bin e finirai per passare anni a chiederti perché la tua modifica non ha funzionato.
Sarah Phillips
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.