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>

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

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.


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.


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”.


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”.


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

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.


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.


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> 

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.


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>

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.