log4j: OSTRZEŻENIE W web.xml nie znaleziono programów dołączających do programu rejestrującego

80

Umieściłem już log4jConfigLocation w web.xml, ale nadal otrzymuję następujące ostrzeżenie:

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

Co mnie ominęło?

<?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
źródło

Odpowiedzi:

43

Jeśli to cały plik log4j.properties, wygląda na to, że nigdy nie tworzysz programu rejestrującego. Potrzebujesz linii takiej jak:

log4j.rootLogger=debug,A1
CodeGoat
źródło
1
@Kaffiene: wydaje się, że to Ty nie czytasz całego pytania (w tym przypadku jeden z komentarzy autora do pytania zawiera informacje, których dotyczy odpowiedź). @CodeGoat: +1 za czytanie wszystkich komentarzy.
Francisco Alvarado
@FranciscoAlvarado Mam log4j.propertiesplik w ścieżce klasy, nadal ostrzegam wyświetla w konsoli.
UdayKiran Pulipati
29

Miałem log4j.properties we właściwym miejscu w ścieżce klas i nadal otrzymałem to ostrzeżenie ze wszystkim, co użyło go bezpośrednio. Kod wykorzystujący log4j przez wspólne logowanie wydawał się z jakiegoś powodu w porządku.

Jeśli masz:

log4j.rootLogger=WARN

Zmień to na:

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

Według http://logging.apache.org/log4j/1.2/manual.html :

Główny program rejestrujący jest anonimowy, ale można uzyskać do niego dostęp za pomocą metody Logger.getRootLogger (). Nie ma domyślnego programu dołączającego do katalogu głównego.

Oznacza to, że aby rejestracja się odbyła, musisz określić jakiś program dołączający, dowolny program dołączający, do głównego programu rejestrującego.

Dodanie tego programu dołączającego konsolę do rootLoggera powoduje zniknięcie tej skargi.

Alain O'Dea
źródło
1
Gdzie mogę to wkleić.
UdayKiran Pulipati
@udaykiranpulipati, możesz wkleić to do log4j.properties. Jeśli nie masz log4j.properties, utwórz go w src / main / resources /, jeśli używasz SBT / Gradle / Maven / etc. W przeciwnym razie umieść go gdzieś, aby znalazł się w katalogu głównym ścieżki klas (może w src /).
Alain O'Dea
19

Możesz otrzymać ten błąd, jeśli log4j.propertiesnie ma Cię w ścieżce klas.

Oznacza to, że musisz przenieść log4j.propertiesdo folderu src i ustawić dane wyjściowe do folderu bin, aby w czasie wykonywania log4j.propertiesodczytywać z folderu bin, a błąd zostanie łatwo rozwiązany.

prabhat
źródło
1
Mam ten sam problem w aplikacji komputerowej (aplet). Plik log4j.properties znajduje się już w folderze src. Jak „ustawić wyjście do folderu bin”?
Dilshad Rana
7

To ostrzeżenie zostanie wyświetlone, jeśli program log4j nie może nigdzie znaleźć pliku „log4j.properties” lub „log4j.xml”.

Aaron Digulla
źródło
2
Potwierdzam, że lokalizacja jest prawidłowa. bo kiedy
zmieniam
7

Lub możesz zrobić to, co zrobiłem i zdefiniować rejestrator przed załadowaniem pliku konfiguracyjnego dziennika. Byłoby tak, jak mówią: „Stawianie wozu przed koniem”.

W kodzie:

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

... później

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

Naprawiono zainicjowanie rejestratora po załadowaniu konfiguracji.

Dla geeków było to „Putting Descarte b4 d horse”.

MikeF
źródło
5

Jeśli chcesz skonfigurować samodzielne aplikacje log4j, możesz użyć BasicConfigurator. To rozwiązanie nie będzie dobre dla aplikacji internetowych, takich jak środowisko Spring.

Musisz napisać-

BasicConfigurator.configure();

lub

ServletContext sc = config.getServletContext();
String log4jLocation = config.getInitParameter("log4j-properties-location");
String webAppPath = sc.getRealPath("/");
String log4jProp = webAppPath + log4jLocation;
PropertyConfigurator.configure(log4jProp);
GARIMA KILLEDAR
źródło
4

Jeśli nadal potrzebujesz pomocy, sprawdź nazwę archiwum, musi to być dokładnie „log4j.properties” lub „log4j.xml” (z uwzględnieniem wielkości liter) i postępuj zgodnie z podpowiedzią „Alain O'Dea”. Otrzymałem ten sam błąd, ale po wprowadzeniu tych zmian wszystko działa dobrze. po prostu jak urok :-). mam nadzieję że to pomoże.

Marcelo Daniel
źródło
3

W moim przypadku rozwiązanie było łatwe. Nie musisz niczego deklarować w swoim web.xml.

Ponieważ projekt jest aplikacją internetową, plik konfiguracyjny powinien być włączony WEB-INF/classespo wdrożeniu. W tym celu radzę utworzyć folder zasobów Java ( src/main/resources) (najlepsza praktyka). Innym podejściem jest umieszczenie pliku konfiguracyjnego w swoim src/main/java.

Uważaj na nazwę pliku konfiguracyjnego. Jeśli używasz XML, nazwa pliku to log4j.xml, w przeciwnym razie log4j.properties.

jbatista
źródło
2

Umieść te wiersze na początku pliku web.xml:

<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
źródło
Nie musisz określać log4jConfigLocation. Zajęłoby to ze ścieżki klas.
Krishna
czy dodałeś plik xml do folderu klas?
Krishna,
mój log4j znajduje się w src / main / resources / log4j.xml (używam integracji Spring, a mój plik konfiguracyjny znajduje się w src / min / resources / META-INF / spring / Integration / spring-Integration-context.xml)
MariemJab
folder zasobów w ścieżce klas?
Krishna,
1

OK, widzę wiele odpowiedzi, a niektóre są bardzo poprawne. Jednak żaden nie rozwiązał mojego problemu. Problem w moim przypadku polegał na tym, że uprawnienia systemu plików UNIX miały plik log4j.properties, który edytowałem na serwerze jako należący do roota. i czytelne tylko dla roota. Jednak wdrażana przeze mnie aplikacja internetowa nie mogła odczytać pliku na Tomcat, ponieważ Tomcat domyślnie działa jako użytkownik tomcat w systemach Linux. Mam nadzieję że to pomoże. rozwiązaniem było więc wpisanie „chown tomcat: tomcat log4j.properties” w katalogu, w którym znajduje się plik log4j.properties.

M Deweloper
źródło
1

Dodaj log4jExposeWebAppRoot -> false w swoim web.xml. U mnie działa :)

<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>
W sieci
źródło
0

Miałem ten sam problem. Te same ustawienia konfiguracji i ten sam komunikat ostrzegawczy. U mnie zadziałało: Zmiana kolejności wpisów.

  • Umieściłem wpisy dotyczące konfiguracji dziennika [parametr kontekstu i odbiornik] na górze pliku [przed wpisem dla applicationContext.xml] i zadziałało.

Myślę, że Zakon ma znaczenie.

Roshan Khandelwal
źródło