log4j: WARN In web.xml wurden keine Appender für den Logger gefunden

80

Ich habe die log4jConfigLocation bereits in web.xml abgelegt, erhalte jedoch weiterhin die folgende Warnung:

log4j:WARN No appenders could be found for logger ⤦
    ⤥ (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.

Was habe ich verpasst?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext.xml
        </param-value>
    </context-param>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <listener>
        <listener-class>
            org.springframework.web.util.Log4jConfigListener
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>suara2</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>suara2</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>
Cometta
quelle

Antworten:

43

Wenn dies die gesamte Datei log4j.properties ist, wird anscheinend nie ein Logger erstellt. Sie benötigen eine Zeile wie:

log4j.rootLogger=debug,A1
CodeGoat
quelle
1
@Kaffiene: Es scheint, dass Sie nicht die gesamte Frage lesen (in diesem Fall enthält einer der Kommentare des Autors zu der Frage die Informationen, auf die sich die Antwort bezieht). @CodeGoat: +1 zum Lesen aller Kommentare.
Francisco Alvarado
@FranciscoAlvarado Ich habe eine log4j.propertiesDatei im Klassenpfad, warne immer noch Anzeigen in der Konsole.
UdayKiran Pulipati
29

Ich hatte log4j.properties an der richtigen Stelle im Klassenpfad und bekam diese Warnung immer noch mit allem, was sie direkt verwendete. Code, der log4j über Commons-Logging verwendet, schien aus irgendeinem Grund in Ordnung zu sein.

Wenn Sie haben:

log4j.rootLogger=WARN

Ändern Sie es in:

log4j.rootLogger=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n

Laut http://logging.apache.org/log4j/1.2/manual.html :

Der Root-Logger ist anonym, kann jedoch mit der Methode Logger.getRootLogger () aufgerufen werden. Es ist kein Standard-Appender an root angehängt.

Dies bedeutet, dass Sie dem Root-Logger einen Appender oder einen beliebigen Appender angeben müssen, damit die Protokollierung erfolgt.

Durch Hinzufügen dieses Konsolen- Appenders zum rootLogger verschwindet diese Beschwerde.

Alain O'Dea
quelle
1
Wo kann ich das einfügen?
UdayKiran Pulipati
@udaykiranpulipati können Sie dies in log4j.properties einfügen. Wenn Sie nicht über log4j.properties verfügen, erstellen Sie es in src / main / resources /, wenn Sie SBT / Gradle / Maven / etc. Verwenden. Andernfalls platzieren Sie es an einer Stelle, an der es im Stammverzeichnis des Klassenpfads landet (möglicherweise in src /).
Alain O'Dea
19

Möglicherweise wird dieser Fehler angezeigt, wenn Sie log4j.propertiesnicht im Klassenpfad vorhanden sind.

Dies bedeutet, dass Sie log4j.propertiesden Ordner in den Ordner src verschieben und die Ausgabe auf den Ordner bin setzen müssen, damit zur Laufzeit log4j.propertiesaus dem Ordner bin gelesen und Ihr Fehler leicht behoben werden kann.

Prabhat
quelle
1
Ich habe das gleiche Problem in einer Desktop-Anwendung (Applet). Die Datei log4j.properties befindet sich bereits im Ordner src. Wie setze ich "die Ausgabe auf den Ordner bin"?
Dilshad Rana
7

Diese Warnung wird angezeigt, wenn log4j nirgendwo eine Datei "log4j.properties" oder "log4j.xml" finden kann.

Aaron Digulla
quelle
2
Ich bestätige, dass der Ort korrekt ist. coz wenn ich log4j.properties in einen anderen Namen umbenenne, gibt es Fehler
cometta
7

Oder Sie können das tun, was ich getan habe, und den Logger definieren, bevor die Protokollkonfigurationsdatei geladen wurde. Dies wäre, wie sie sagen: "Den Wagen vor das Pferd stellen."

Im Code:

public static Logger logger = Logger.getLogger("RbReport");

... später

PropertyConfigurator.configure(l4j);
logger = Logger.getLogger("RbReport");

Fix war, den Logger nach dem Laden der Konfiguration zu initialisieren.

Für die Geeks war es "Putting Descarte b4 d Horse".

MikeF
quelle
5

Wenn Sie für die eigenständigen log4j-Anwendungen konfigurieren möchten, können Sie den BasicConfigurator verwenden. Diese Lösung eignet sich nicht für Webanwendungen wie die Spring-Umgebung.

Sie müssen schreiben-

BasicConfigurator.configure();

oder

ServletContext sc = config.getServletContext();
String log4jLocation = config.getInitParameter("log4j-properties-location");
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
PropertyConfigurator.configure(log4jProp);
GARIMA KILLEDAR
quelle
4

Wenn Sie dennoch Hilfe benötigen, überprüfen Sie den Namen des Archivs. Es muss genau "log4j.properties" oder "log4j.xml" (Groß- und Kleinschreibung beachten) sein und dem Hinweis von "Alain O'Dea" folgen. Ich habe den gleichen Fehler erhalten, aber nachdem ich diese Änderungen vorgenommen habe, funktioniert alles einwandfrei. wie ein Zauber :-). hoffe das hilft.

Marcelo Daniel
quelle
3

In meinem Fall war die Lösung einfach. Sie müssen nichts in Ihrem deklarieren web.xml.

Da es sich bei Ihrem Projekt um eine Webanwendung handelt, sollte die Konfigurationsdatei WEB-INF/classesnach der Bereitstellung aktiviert sein . Ich empfehle Ihnen, einen Java-Ressourcenordner ( src/main/resources) zu erstellen, um dies zu tun (beste Übung). Ein anderer Ansatz besteht darin, die Konfigurationsdatei in Ihre zu legen src/main/java.

Achten Sie auf den Namen der Konfigurationsdatei. Wenn Sie XML verwenden, lautet der Dateiname log4j.xmlandernfalls log4j.properties.

jbatista
quelle
2

Fügen Sie diese Zeilen am Anfang von web.xml ein:

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:/main/resources/log4j.xml</param-value>
</context-param> 
MariemJab
quelle
Sie müssen den log4jConfigLocation nicht angeben. Es würde vom Klassenpfad dauern.
Krishna
Haben Sie eine XML-Datei im Klassenordner hinzugefügt?
Krishna
Mein log4j befindet sich unter src / main / resources / log4j.xml (Ich verwende die Spring-Integration und meine Konfigurationsdatei befindet sich unter src / min / resources / META-INF / spring / Integration / spring-Integration-context.xml)
MariemJab
Ressourcenordner unter Klassenpfad?
Krishna
1

OK, ich sehe viele Antworten und einige sehr richtig. Allerdings hat keiner mein Problem behoben. Das Problem in meinem Fall war, dass die UNIX-Dateisystemberechtigungen die Datei log4j.properties enthielten, die ich auf dem Server als Eigentum von root bearbeitete. und nur von root lesbar. Die Webanwendung, die ich für Tomcat bereitstellte, konnte die Datei jedoch nicht lesen, da Tomcat standardmäßig als Benutzer Tomcat auf Linux-Systemen ausgeführt wird. Hoffe das hilft. Die Lösung bestand also darin, "chown tomcat: tomcat log4j.properties" in das Verzeichnis einzugeben, in dem sich die Datei "log4j.properties" befindet.

M Der Entwickler
quelle
1

Fügen Sie log4jExposeWebAppRoot -> false in Ihre web.xml ein. Es funktioniert bei mir :)

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>path/log4j.properties</param-value>
</context-param>
<context-param>
    <param-name>log4jExposeWebAppRoot</param-name>
    <param-value>false</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
Innet
quelle
0

Ich hatte das gleiche Problem. Gleiche Konfigurationseinstellungen und gleiche Warnmeldung. Was für mich funktioniert hat war: Ändern der Reihenfolge der Einträge.

  • Ich habe die Einträge für die Protokollkonfiguration [den Kontextparameter und den Listener] oben in die Datei eingefügt [vor dem Eintrag für die applicationContext.xml] und es hat funktioniert.

Der Orden ist wichtig, denke ich.

Roshan Khandelwal
quelle