Non è stato possibile trovare appendici per il logger (log4j)?


370

Ho inserito log4j sul mio buildpath, ma quando eseguo la mia applicazione ricevo il seguente messaggio:

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.

Cosa significano questi avvisi? Qual è l'appender qui?


5
Sembra un avviso di runtime. Sei sicuro di vederlo durante la compilazione?
maba,

5
Hai provato a visitare l'URL nell'ultima riga degli avvisi?
Jesper,

4
sì!!! ma non dice molto ... Ho scoperto che ho bisogno di un file di proprietà per configurare il mio appender!
maximus,

Modifica manualmente i file di configurazione per aggiungere l'appender. Assicurati di avere il documento di configurazione giusto e valido.
Romano C

Risposte:


465

Questa breve introduzione alla guida di log4j è un po 'vecchia ma ancora valida.

Tale guida ti fornirà alcune informazioni su come utilizzare logger e appendici.


Solo per farti andare hai due semplici approcci che puoi adottare.

Il primo è semplicemente aggiungere questa riga al metodo principale:

BasicConfigurator.configure();

Il secondo approccio è aggiungere questo file standard log4j.properties(tratto dalla guida sopra menzionata) al tuo percorso di classe:

# 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

3
Il primo passo è ok. Citazione da Breve introduzione alla guida di log4j
ray6080,

65
Per i nuovi inciampi ... aggiungi il file log4j.properties a src / main / resources e questo presuppone che tu abbia un progetto maven. Le cose in src / main / resources sono incluse nel percorso di classe.
keni,

3
Nell'idea IntelliJ, apri l'impostazione del modulo e seleziona la cartella delle risorse e fai clic sulle risorse, aggiungerà automaticamente ogni risorsa al percorso di classe.
Waqas,

1
Non ha aiutato Uso Eclipse Neon per C ++ e ho messo log4j.properties accanto all'eseguibile eclipse e non ho aiutato
Nadav B

log4j.rootLogger=DEBUG, A1è la linea che mi mancava tutto il tempo.
Mohammad Faisal

74

Sembra che tu debba aggiungere la posizione del tuo log4j.propertiesfile al Classpath in Eclipse.

Assicurati che il tuo progetto sia aperto in Eclipse, quindi fai clic sul menu "Esegui" nella parte superiore di Eclipse e fai clic su quanto segue:

  1. Correre
  2. Esegui configurazioni
  3. Percorso di classe (scheda)
  4. Voci utente
  5. Avanzate (pulsante a destra)
  6. Aggiungi cartelle
  7. quindi vai alla cartella che contiene il file log4j.properties
  8. Applicare
  9. Correre

Il messaggio di errore non dovrebbe più apparire.


I messaggi di avviso non vengono visualizzati ora ma i log non vengono ancora scritti nella posizione desiderata
Arpan Saini

48

Soluzione rapida:

  1. aggiungi codice alla funzione principale :

    String log4jConfPath = "/path/to/log4j.properties";
    PropertyConfigurator.configure(log4jConfPath);
  2. crea un file chiamato log4j.properties in / 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

Inserisci il file log4j.properties nella directory delle risorse come src / test / resource
Alok,

Per evitare la dichiarazione esplicita del percorso log4j.properties; inserirlo nella cartella del progetto e accedervi come String log4jConfPath = System.getProperty ("user.dir") + File.separator + "log4j.properties";
Amimo Benja,

36

Questo è solo un avvertimento.

Fissaggio

Ciò si verifica quando i file di configurazione di default log4j.propertiese log4j.xmlnon può essere trovato e le esegue applicazioni alcuna configurazione esplicita.

Per risolvere il problema, è sufficiente creare / copiare log4j.propertieso log4j.xmlnella propria posizione sul percorso di classe (di solito lo stesso dei file jar).

Opzionalmente impostare l'opzione java: -Dlog4j.configuration=file:///path/to/log4j.properties.

log4jutilizza Thread.getContextClassLoader().getResource()per individuare i file di configurazione predefiniti e non controlla direttamente il file system. Conoscere la posizione appropriata da posizionare log4j.propertieso log4j.xmlrichiede la comprensione della strategia di ricerca del caricatore di classi in uso. log4jnon fornisce una configurazione predefinita poiché l'output sulla console o sul file system potrebbe essere vietato in alcuni ambienti.

Debug

Per il debug, puoi provare a utilizzare il -Dlog4j.debug=trueparametro.

Configurazione di log4j.properties

Esempio di configurazione di 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

Ecco un altro file di configurazione che utilizza più appendici:

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

Se si utilizza Solr , copiarlo <solr>/example/resources/log4j.propertiesin una posizione sul percorso di classe .

La configurazione di esempio di log4j.propertiesda Solr è simile a:

#  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

Guarda anche:


13

La maggior parte delle risposte qui suggeriscono che il log4j.propertiesfile deve essere collocato nella giusta posizione (per il progetto Maven, dovrebbe trovarsi insrc/main/resources )

Ma per me, il problema è che my log4j.propertiesnon è configurato correttamente. Ecco un esempio che funziona per me, puoi provarlo prima.

# 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

1
Il fatto che log4j consideri "impossibile trovare il file" e "specifiche incomplete nel file" come lo stesso errore è una perdita di tempo.
Ed Norris,

1
Per me questa è la risposta migliore. Voto a favore e ho aggiunto alcune spiegazioni nella tua risposta.
schlebe,

La migliore risposta per me !!!
nosequeweaponer

8

Come spiegato in precedenza ci sono 2 approcci

Il primo è semplicemente aggiungere questa riga al metodo principale:

BasicConfigurator.configure();

Il secondo approccio è quello di aggiungere questo log4j.properties standard file al percorso di classe:

Durante il secondo approccio è necessario assicurarsi di inizializzare correttamente il file, ad es.

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

Assicurarsi di creare la cartella richiesta per archiviare i file di registro.


Avevo lo stesso problema e ho usato BasicConfigurator.configure (); nel metodo principale e ora il codice viene eseguito correttamente.
Surabhi Pandey,

7

Si utilizza il Loggernel codice per registrare un messaggio. Il Appenderè un oggetto aggiunto a un Loggerscrivere il messaggio a un target specifico. Ci sono FileAppenderda scrivere su file di testo o ConsoleAppenderda scrivere sulla console. Per ulteriori informazioni, è necessario mostrare il proprio codice di configurazione del logger e dell'appender.

leggere il tutorial per una migliore comprensione dell'interazione di Logger e Appender.


6

Assicurarsi che il file delle proprietà sia impostato correttamente. E ancora, sembra che il compilatore non riesca a trovare il file delle proprietà, è possibile impostare come segue sul pom (solo quando si utilizza il progetto Maven).

<build>
       <sourceDirectory> src/main/java</sourceDirectory>
       <testSourceDirectory> src/test/java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >

Questo! Ho passato ore a trovare una risposta. Il mio codice caso funziona bene in Linux ma questo errore è presente in Windows (stesso IDE NB) e tutte le soluzioni sopra riportate non funzionano!
Tiana987642,

5

Ho fatto lo stesso errore. Ecco il problema che porta a questo messaggio di errore:

Creo alcuni oggetti che utilizzano il Logger prima di configurare log4j:

Logger.getLogger(Lang.class.getName()).debug("Loading language: " + filename);

Soluzione: configurare log4j all'inizio nel metodo principale:

PropertyConfigurator.configure(xmlLog4JConfigFile); 
// or BasicConfigurator.configure(); if you dont have a config file

Grazie mille!!! Tutti stanno solo assumendo Spring o Tomcat, o qualsiasi altra cosa per inizializzare la configurazione.
Windgazer


3

Un altro motivo per cui ciò può accadere (in RCP4) è che si stanno utilizzando più framework di registrazione nel file di destinazione. Ad esempio, ciò si verificherà se si utilizza una combinazione di slf4j, log4j e ch.qos.logback.slf4j nella scheda del contenuto dei file di destinazione.


3

Aggiungi quanto segue come primo codice:

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

2

Nel mio caso, l'errore era la bandiera " additività ". Se è "falso" per il pacchetto di progetto principale, i pacchetti figlio non avranno un appender e vedrai l' errore " appender not found ".


2

Ho riscontrato lo stesso problema quando ho provato a eseguire la classe di test JUnit.

Il problema viene risolto dopo aver aggiunto manualmente il file log4j.properties nella cartella src / test / resources.

L'aggiunta del codice seguente al file log4j.properties ha risolto il problema:

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# 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

1

Ho riscontrato questo problema durante il tentativo di creare un jar eseguibile con Maven in Intellij 12. È risultato che poiché il file manifest java non includeva un percorso di classe, il file delle proprietà log4j non è stato trovato a livello di root (dove il il file jar è stato eseguito da.)

Cordiali saluti, stavo ottenendo il logger in questo modo:

Logger log = LogManager.getLogger(MyClassIWantedToLogFrom.class);

E sono stato in grado di farlo funzionare con un file pom che includeva questo:

         <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

Assicurati che il tuo progetto sia aperto in Eclipse, quindi fai clic sul menu "Esegui" nella parte superiore di Eclipse e fai clic su quanto segue:

  1. Correre

  2. Esegui configurazioni

  3. Percorso di classe (scheda)

  4. Voci utente

  5. aggiungi il vaso a destra

  6. aggiungi il file jar log4j

  7. Applicare

  8. Correre

Il messaggio di errore non dovrebbe più apparire.


1

La ragione può essere la mancanza della parola staticin alcuni:

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

Se faccio del logger il campo dell'istanza, ricevo esattamente questo avvertimento:

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

Quel che è peggio, l'avvertimento indica non ProcessorTestdove vive l'errore, ma verso una classe assolutamente diversa (Mittente) come fonte di problemi. Quella classe ha il set logger corretto e non ha bisogno di modifiche! Potremmo cercare il problema per anni!


1

Ho riscontrato lo stesso problema quando utilizzo log4j2. Il mio problema è causato dall'utilizzo di una libreria dipendente errata:

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <scope>runtime</scope>
    </dependency>

Invece, dovrei usare:

<dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <scope>runtime</scope>
    </dependency>

Nel mio caso, ho un log4j2.xml definito nella mia directory "risorse", e specificato per usarlo da:

System.setProperty("log4j.configurationFile", "log4j2.xml");

1

Log4J visualizza questo messaggio di avviso quando il codice Java Log4j sta cercando di creare una prima riga di registro nel programma.

In questo momento, Log4j realizza 2 cose

  1. cerca per trovare il log4j.propertiesfile
  2. cerca per creare un'istanza definita dall'appender log4j.properties

Se log4Jnon trova il log4j.propertiesfile o se l'appender dichiarato in log4j.rootloggernon è definito altrove nel log4j.propertiesfile, viene visualizzato il messaggio di avviso.

ATTENZIONE: il contenuto del file Proprietà deve essere corretto.

Il seguente contenuto NON è corretto

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

perché l' fileappender è dichiarato in LOWER-CASE inlog4j.rootlogger nell'istruzione e definito nell'istruzione log4j.appender utilizzando UPPER-CASE!

Un file corretto sarebbe

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

Se si utilizza MAVEN, è necessario inserire i file log4j.properties src/main/resources E avviare una build MAVEN.

Il file Log4j.properties viene quindi copiato target/classes cartella.

Log4J usa il log4j.propertiesfile che ha trovato target/classes!


1

Ho avuto anche questo problema. Ho appena dimenticato di contrassegnare la directory delle risorse in IntelliJ IDEA

  1. Fare clic con il tasto destro sulla directory
  2. Segna la directory come
  3. Risorse radice

1

Se stai usando Eclipse e questo problema è apparso dal nulla dopo che tutto ha funzionato bene in anticipo, prova ad andare su Project - Clean - Clean.


0

La mia installazione di Eclipse non è stata trovata log4j.propertiesdurante l'esecuzione dei test JUnit da Eclipse, anche se il file si trovava insrc/test/resources .

Il motivo era che Eclipse (o il connettore m2e ) non copiava il contenuto dalla src/test/resourcescartella di output prevista target/test-classes- la causa principale era che nelle proprietà del progetto in Java Build Path -> scheda Source -> cartelle di origine sul percorso di build -> src / test / risorse , in qualche modo c'era una Excluded: **voce. Ho rimosso quella voce esclusa .

In alternativa, ho potuto copiati manualmente src/test/resources/log4j.propertiesal target/test-classes/log4j.properties.


0

Se log4j.properties è effettivamente sul percorso di classe, stai utilizzando Spring Boot per creare un file WAR per la distribuzione in un server app, stai omettendo un web.xmlfile a favore della configurazione automatica di Spring Boot e non ricevi alcun messaggio di log, devi esplicitamente configurare Log4j. Supponendo che si stia utilizzando 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

Forse aggiungere il progetto rilevante contiene log4j nel percorso di compilazione Java, aggiungo mahout_h2o in esso quando ho riscontrato questo problema in un progetto mahout usando eclipse, funziona!


0

se lavori insieme a molti progetti potresti avere un problema di stile.

* devi avere un file lof4j.properties e questo file include le proprietà del registro di altri progetti.

* Inoltre, puoi provare a mettere i file delle proprietà log4j nel percorso src quando il progetto funziona sul sistema operativo Linux, le librerie di altri progetti e i file log4.properties possono trovarsi in una cartella in una posizione sul percorso di classe.


0

Prima importazione:

 import org.apache.log4j.PropertyConfigurator;

Quindi aggiungi il codice seguente al metodo principale:

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

Creare un file nel percorso e aggiungere il codice seguente a quel file.

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

La soluzione su questo sito ha funzionato per me https://crunchify.com/java-how-to-configure-log4j-logger-property-correctly/ . Ora non vedo alcun avviso da log4j

L'ho inserito in un file log4j.properties che ho inserito in 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

Prima di tutto: crea un file 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

Inseriscilo in src / main / resources /

Successivamente, utilizzare queste 2 dipendenze:

<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>

È necessario aggiungere questa dipendenza finale al file POM:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

0

Considera l'argomento JVM log4j Dlog4j.configuration

In generale:

Aggiungi l'argomento JVM che indica il file di configurazione log4j. La sintassi è proprio come segue:

java [ options ] -jar file.jar [ arguments ]

Un esempio di una riga di comando reale è simile al seguente:

java -Dlog4j.configuration=conf/log4j.xml -jar myJarFile.jar myArg1 myArg2

Per gli utenti IntelliJ IDE:

1.Run/Debug Configurations
2.Edit configurations...
3.VM options
4.Enter the same value also starting with "-D"

Suggerimenti:

1.Eclipse Gli utenti IDE troveranno un approccio equivalente

2.Per l'editor di configurazione di esecuzione / debug, è molto probabile che, all'inizio dei tempi, il tuo particolare file eseguibile non sia presente. A seconda delle dimensioni del progetto su cui stai attualmente lavorando, può essere spiacevole navigare nelle directory per trovarlo. È meno complicato se esegui / esegui il file (fai clic su Riproduci) una volta prima di procedere all'esecuzione / debug della configurazione, indipendentemente dal risultato dell'esecuzione.

3. Prestare attenzione alla directory di lavoro, ai percorsi relativi e al percorso di classe.


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.