it-swarm.com.de

Für logger (log4j) wurden keine Appender gefunden?

Ich habe log4j in meinen Erstellungspfad eingefügt, erhalte jedoch die folgende Meldung, wenn ich meine Anwendung ausführe:

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.

Was bedeuten diese Warnungen? Was ist der Appender hier?

323
maximus

Diese kurze Einführung in log4j Anleitung ist ein bisschen alt, aber immer noch gültig.

In diesem Handbuch finden Sie einige Informationen zur Verwendung von Protokollierern und Appendern.


Um Sie zum Laufen zu bringen, haben Sie zwei einfache Ansätze.

Zunächst fügen Sie einfach diese Zeile zu Ihrer Hauptmethode hinzu:

BasicConfigurator.configure();

Der zweite Ansatz besteht darin, diese Standarddatei log4j.properties (aus dem oben genannten Handbuch entnommen) zu Ihrem Klassenpfad hinzuzufügen:

# 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
410
maba

Anscheinend müssen Sie den Speicherort Ihrer log4j.properties -Datei zum Klassenpfad in Eclipse hinzufügen.

Stellen Sie sicher, dass Ihr Projekt in Eclipse geöffnet ist, klicken Sie oben in Eclipse auf das Menü "Ausführen" und dann auf Folgendes:

  1. Lauf
  2. Konfigurationen ausführen
  3. Klassenpfad (Registerkarte)
  4. Benutzereinträge
  5. Erweitert (Schaltfläche rechts)
  6. Ordner hinzufügen
  7. navigieren Sie dann zu dem Ordner, der Ihre Datei log4j.properties enthält
  8. Anwenden
  9. Lauf

Die Fehlermeldung sollte nicht mehr angezeigt werden.

72
JDJ

Schnelle Lösung:

  1. code hinzufügen zu Hauptfunktion:

    String log4jConfPath = "/path/to/log4j.properties";
    PropertyConfigurator.configure(log4jConfPath);
    
  2. erstellen Sie eine Datei mit dem Namen log4j.properties unter / 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
    
41
lancerex

Dies ist nur eine Warnung.

Festsetzung

Dies tritt auf, wenn die Standardkonfigurationsdateien log4j.properties und log4j.xml nicht gefunden werden und die Anwendung keine explizite Konfiguration ausführt.

Um dies zu beheben, erstellen/kopieren Sie einfach log4j.properties oder log4j.xml an Ihre a-Position im Klassenpfad (normalerweise derselbe wie der jar files).

Optional können Sie die Option Java einstellen: -Dlog4j.configuration=file:///path/to/log4j.properties.

log4j verwendet Thread.getContextClassLoader().getResource(), um die Standardkonfigurationsdateien zu finden, und überprüft das Dateisystem nicht direkt. Um zu wissen, wo log4j.properties oder log4j.xml platziert werden kann, muss die Suchstrategie des verwendeten Klassenladeprogramms bekannt sein. log4j bietet keine Standardkonfiguration, da die Ausgabe an die Konsole oder in das Dateisystem in einigen Umgebungen möglicherweise verboten ist.

Debuggen

Sie können versuchen, zum Debuggen den Parameter -Dlog4j.debug=true zu verwenden.

Konfiguration von log4j.properties

Beispielkonfiguration von 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

Hier ist eine andere Konfigurationsdatei, die mehrere Appender verwendet:

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

Wenn Sie Solr verwenden, kopieren Sie <solr>/example/resources/log4j.properties an eine Position im Klassenpfad .

Die Beispielkonfiguration von log4j.properties von Solr sieht folgendermaßen aus:

#  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

Siehe auch:

33
kenorb

Die meisten Antworten hier deuteten darauf hin, dass die log4j.properties -Datei an der richtigen Stelle abgelegt werden sollte (für ein Maven-Projekt sollte sie sich in src/main/resources befinden).

Aber für mich ist das Problem, dass mein log4j.properties nicht richtig konfiguriert ist. Hier ist ein Beispiel, das für mich funktioniert. Sie können es zuerst ausprobieren.

# 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
7
Searene

Sie verwenden das Logger in Ihrem Code, um eine Nachricht zu protokollieren. Das Appender ist ein Objekt, das an ein Logger angehängt wird, um die Nachricht an ein bestimmtes Ziel zu schreiben. Es gibt FileAppender zum Schreiben in Textdateien oder ConsoleAppender zum Schreiben in die Konsole. Sie müssen Ihren Code des Logger- und Appender-Setups anzeigen, um weitere Hilfe zu erhalten.

bitte lesen Sie das Tutorial , um die Interaktion zwischen Logger und Appender besser zu verstehen.

7
Simulant

Wie bereits erläutert, gibt es zwei Ansätze

Zunächst fügen Sie einfach diese Zeile zu Ihrer Hauptmethode hinzu:

BasicConfigurator.configure();

Der zweite Ansatz besteht darin, diese Standarddatei log4j.properties zu Ihrem Klassenpfad hinzuzufügen:

Während Sie den zweiten Ansatz wählen, müssen Sie sicherstellen, dass Sie die Datei ordnungsgemäß initialisieren, z.

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

Stellen Sie sicher, dass Sie den erforderlichen Ordner zum Speichern der Protokolldateien erstellen.

7
AkashK

Stellen Sie sicher, dass die Eigenschaftendatei ordnungsgemäß festgelegt wurde. Und wieder sieht es so aus, als ob der Compiler die Eigenschaftendatei nicht finden kann. Sie können dies am pom wie folgt einstellen (nur wenn Sie maven project verwenden).

<build>
       <sourceDirectory> src/main/Java</sourceDirectory>
       <testSourceDirectory> src/test/Java</testSourceDirectory>
        <resources>
             <resource>
                  <directory>resources</directory>
             </resource>
        </resources>           
</build >
5
belvey

Ich bekomme den gleichen Fehler. Hier das Problem, das zu dieser Fehlermeldung führt:

Ich erstelle einige Objekte, die den Logger verwenden, bevor ich das log4j konfiguriere:

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

Lösung: Konfigurieren Sie das log4j am Anfang der Hauptmethode:

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

Ich denke, Sie sollten verstehen, wo die log4j-JAR-Datei oder der Code Java nach den log4j-Konfigurationsdateien sucht.

src/main/resources/log4j.properties ist der Eclipse-Pfad. Platzieren Sie sie an einem geeigneten Ort, damit Sie den absoluten Pfad im Code nicht fest codieren müssen.

Lesen Sie dazu meinen Artikel und meine Musterlösung http://askyourquestions.info/2016/03/27/how-to-see-where-the-log-is-logger-in-slf4j/

3
Jin Thakur

Fügen Sie als ersten Code Folgendes hinzu:

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

Ein weiterer Grund dafür kann sein, dass Sie in Ihrer Zieldatei mehrere Protokollierungsframeworks verwenden (in RCP4). Dies tritt beispielsweise auf, wenn Sie eine Kombination aus slf4j, log4j und ch.qos.logback.slf4j auf der Registerkarte "Inhalt" Ihrer Zieldateien verwenden.

2
ekjcfn3902039

In meinem Fall war der Fehler das Flag "Additivität". Wenn es für Ihr Root-Projektpaket "false" ist, haben die untergeordneten Pakete keinen Appender und es wird der Fehler "Appender nicht gefunden" angezeigt.

2
Antonio Martin

Ich hatte das gleiche Problem, wenn ich log4j2 verwende. Mein Problem wird durch die Verwendung einer falschen abhängigen Bibliothek verursacht:

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

Stattdessen sollte ich verwenden:

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

In meinem Fall habe ich eine log4j2.xml in meinem "resources" -Verzeichnis definiert und angegeben, dass sie verwendet werden soll von:

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

Der Grund kann das Fehlen des Wortes static in einigen sein:

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

Wenn ich Logger zum Instanzfeld mache, erhalte ich genau diese Warnung:

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

Was noch schlimmer ist, die Warnung weist nicht auf ProcessorTest hin, wo der Fehler liegt, sondern auf eine völlig andere Klasse (Sender) als Ursache von Problemen. That class hat den richtigen Setlogger und braucht keine Änderungen! Wir könnten das Problem für Ewigkeiten suchen!

1
Gangnus

Log4J zeigt diese Warnmeldung an, wenn der Code Log4J Java sucht, um eine erste Protokollzeile in Ihrem Programm zu erstellen.

In diesem Moment macht Log4j zwei Dinge

  1. es wird nach log4j.properties Dateien gesucht
  2. es sucht, um die Appender-Definition in log4j.properties zu instanziieren.

Wenn log4J die log4j.properties -Datei nicht findet oder wenn der in log4j.rootlogger deklarierte Appender an keiner anderen Stelle in der log4j.properties -Datei definiert ist, wird die Warnmeldung angezeigt.

ACHTUNG: Der Inhalt der Eigenschaftendatei muss korrekt sein.

Der folgende Inhalt ist NICHT korrekt

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

weil der Appender file in der Anweisung log4j.rootlogger in LOWER-CASE deklariert und in der Anweisung log4j.appender mit UPPER-CASE definiert ist!

Eine korrekte Datei wäre

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

Wenn MAVEN verwendet wird, müssen Sie log4j.properties-Dateien in src/main/resources ablegen UND einen MAVEN-Build starten.

Die Datei Log4j.properties wird dann in den Ordner target/classes kopiert.

Log4J verwendet die log4j.properties -Datei, die es in target/classes gefunden hat!

1
schlebe

Ich bin auf dieses Problem gestoßen, als ich versucht habe, eine ausführbare JAR-Datei mit maven in Intellij 12 zu erstellen. Da die Manifestdatei Java keinen Klassenpfad enthielt, konnte die Eigenschaftendatei log4j nicht gefunden werden die Root-Ebene (von der aus die JAR-Datei ausgeführt wurde)

Zu Ihrer Information, ich habe den Logger so bekommen:

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

Und ich konnte es mit einer POM-Datei zum Laufen bringen, die Folgendes enthielt:

         <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
jmort

Stellen Sie sicher, dass Ihr Projekt in Eclipse geöffnet ist, klicken Sie oben in Eclipse auf das Menü "Ausführen" und dann auf Folgendes:

  1. Lauf

  2. Konfigurationen ausführen

  3. Klassenpfad (Registerkarte)

  4. Benutzereinträge

  5. füge das Glas rechts hinzu

  6. füge log4j jar Datei hinzu

  7. Anwenden

  8. Lauf

Die Fehlermeldung sollte nicht mehr angezeigt werden.

1
Varaj Vignesh

Die Lösung auf dieser Site funktionierte für mich https://crunchify.com/Java-how-to-configure-log4j-logger-property-correctly/ . Ich sehe jetzt überhaupt keine Warnungen von log4j

Ich habe dies in eine log4j.properties-Datei geschrieben, die ich in src/main/resources abgelegt habe

# 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
ihossain

wenn Sie mit vielen Projekten zusammenarbeiten, kann dies zu Stilproblemen führen.

* Sie müssen eine lof4j.properties-Datei haben und diese Datei ist in den Protokolleigenschaften eines anderen Projekts enthalten.

* Außerdem können Sie versuchen, log4j-Eigenschaftendateien im Quellpfad abzulegen, wenn das Projekt unter Linux ausgeführt wird. Die Bibliotheken anderer Projekt- und log4.properties-Dateien können sich unter einem Ordner an einem Speicherort im Klassenpfad befinden.

0
yasin

Meine Eclipse-Installation konnte beim Ausführen von JUnit Tests in Eclipse log4j.properties nicht finden, obwohl sich die Datei unter src/test/resources befand.

Der Grund war, dass Eclipse (oder der Konnektor m2e) den Inhalt nicht von src/test/resources in den erwarteten Ausgabeordner target/test-classes kopierte - die Hauptursache war die in den Eigenschaften des Projekts unter - Java Build Path -> Source tab -> Quellordner im Build Path -> src/test/resources, irgendwie es gab einen Excluded: ** Eintrag. Ich habe diesen ausgeschlossen Eintrag entfernt.

Alternativ hätte ich src/test/resources/log4j.properties manuell nach target/test-classes/log4j.properties kopieren können.

0
Abdull

Ich hatte das gleiche Problem, als ich versuchte, die JUnit-Testklasse auszuführen.

Das Problem ist behoben, nachdem ich die Datei log4j.properties manuell im Ordner src/test/resources hinzugefügt habe.

Durch Hinzufügen des folgenden Codes zur Datei log4j.properties wurde das Problem behoben:

# 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
0

Ich hatte auch dieses Problem. Ich habe nur vergessen, das Ressourcenverzeichnis in IntelliJ IDEA zu markieren

  1. Klicken Sie mit der rechten Maustaste auf Ihr Verzeichnis
  2. Verzeichnis als markieren
  3. Ressourcen root
0
Sadap

Wenn sich log4j.properties tatsächlich im Klassenpfad befindet, verwenden Sie Spring Boot, um eine WAR-Datei für die Bereitstellung auf einem App-Server zu erstellen, und Sie lassen eine web.xml -Datei zugunsten der automatischen Konfiguration von Spring Boot aus Um Protokollmeldungen zu erhalten, müssen Sie Log4j explizit konfigurieren. Angenommen, Sie verwenden 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
Brian Schalme

Vielleicht füge das relevante Projekt log4j in Java build path hinzu. Ich füge mahout_h2o hinzu, als ich auf dieses Problem in einem Mahout-Projekt mit Eclipse stieß. Es funktioniert!

0
NightWind

Erster Import:

 import org.Apache.log4j.PropertyConfigurator;

Fügen Sie dann den folgenden Code zur Hauptmethode hinzu:

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

Erstellen Sie eine Datei unter Pfad z und fügen Sie den folgenden Code zu dieser Datei hinzu.

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
himansug