log4j : WARN web.xml에서 로거에 대한 추가자를 찾을 수 없습니다.


80

이미 web.xml에 log4jConfigLocation을 넣었지만 여전히 다음 경고가 표시됩니다.

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

내가 놓친 게 무엇입니까?

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

답변:


43

이것이 전체 log4j.properties 파일이라면 실제로 로거를 생성하지 않는 것처럼 보입니다. 다음과 같은 줄이 필요합니다.

log4j.rootLogger=debug,A1

1
@Kaffiene : 전체 질문을 읽지 않는 것 같습니다 (이 경우 질문에 대한 작성자의 의견 중 하나가 답변이 참조하는 정보를 제공합니다). @CodeGoat : 모든 댓글을 읽으려면 +1합니다.
Francisco Alvarado

@FranciscoAlvarado log4j.properties클래스 경로에 파일이 있지만 콘솔에 여전히 경고가 표시됩니다.
UdayKiran Pulipati

29

클래스 경로의 올바른 위치에 log4j.properties가 있었지만 직접 사용하는 모든 경고가 계속 표시되었습니다. commons-logging을 통해 log4j를 사용하는 코드는 어떤 이유로 든 괜찮은 것 같았습니다.

당신이 가지고 있다면:

log4j.rootLogger=WARN

다음으로 변경하십시오.

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

http://logging.apache.org/log4j/1.2/manual.html 에 따르면 :

루트 로거는 익명이지만 Logger.getRootLogger () 메서드를 사용하여 액세스 할 수 있습니다. 루트에 연결된 기본 어 펜더가 없습니다.

이것이 의미하는 바는 로깅이 발생하기 위해 루트 로거에 일부 appender, any appender를 지정해야한다는 것입니다.

해당 콘솔 어 펜더를 rootLogger에 추가 하면이 불만이 사라집니다.


1
이것을 어디에 붙여 넣을 수 있습니까?
UdayKiran Pulipati

@udaykiranpulipati 당신은 이것을 log4j.properties에 붙여 넣을 수 있습니다. log4j.properties가 없으면 SBT / Gradle / Maven / etc를 사용하는 경우 src / main / resources /에 만듭니다. 그렇지 않으면 클래스 경로의 루트 (src /에있을 수 있음)에 위치하도록 어딘가에 넣으십시오.
Alain O'Dea

19

log4j.properties클래스 경로에없는 경우이 오류가 발생할 수 있습니다 .

log4j.properties,을 src 폴더로 이동하고 출력을 bin 폴더로 설정해야 런타임 log4j.properties에 bin 폴더에서 읽을 수 있고 오류가 쉽게 해결됩니다.


1
데스크톱 애플리케이션 (Applet)에서 동일한 문제가 있습니다. log4j.properties 파일은 이미 src 폴더에 있습니다. "출력을 bin 폴더로 설정"하려면 어떻게합니까?
Dilshad Rana 2015

7

log4j가 "log4j.properties"또는 "log4j.xml"파일을 어디에도 찾을 수없는 경우이 경고가 표시됩니다.


2
나는 위치가 정확한지 확인한다. coz 내가 log4j.properties의 이름을 다른 이름으로 바꾸면 오류가 발생합니다
cometta

7

또는 로그 구성 파일이로드되기 전에 내가 한 작업을 수행하고 로거를 정의 할 수 있습니다. 이것은 그들이 말하는 것과 같습니다 : "말 앞에 카트를 넣기."

코드에서 :

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

... 나중에

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

구성이로드 된 후 로거를 초기화하는 문제를 수정했습니다.

괴짜들에게는 "Putting Descarte b4 d horse"였습니다.


5

독립형 log4j 응용 프로그램을 구성하려면 BasicConfigurator를 사용할 수 있습니다. 이 솔루션은 Spring 환경과 같은 웹 애플리케이션에 적합하지 않습니다.

당신은 쓸 필요가 있습니다-

BasicConfigurator.configure();

또는

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

4

여전히 도움이된다면 아카이브의 이름을 확인하고 정확한 "log4j.properties"또는 "log4j.xml"(대소 문자 구분)이어야하며 "Alain O'Dea"의 힌트를 따르십시오. 나는 같은 오류가 발생했지만 이러한 변경을 한 후에는 모든 것이 잘 작동합니다. 마치 매력처럼 :-). 도움이 되었기를 바랍니다.


3

제 경우에는 해결책이 쉬웠습니다. .NET Framework에서 아무것도 선언 할 필요가 없습니다 web.xml.

프로젝트가 웹 애플리케이션이므로 WEB-INF/classes배포 후 구성 파일이 켜져 있어야 합니다. 이를 위해 Java 리소스 폴더 ( src/main/resources)를 만드는 것이 좋습니다 (최선의 방법). 또 다른 접근 방식은 구성 파일을 src/main/java.

구성 파일 이름에주의하십시오. XML을 사용하는 경우 파일 이름은 log4j.xml입니다 log4j.properties.


2

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> 

log4jConfigLocation을 지정할 필요가 없습니다. 클래스 경로에서 가져옵니다.
Krishna

클래스 폴더 안에 xml 파일을 추가 했습니까?
Krishna

내 log4j는 src / main / resources / log4j.xml에 있습니다 (스프링 통합을 사용하고 있으며 구성 파일은 src / min / resources / META-INF / spring / integration / spring-integration-context.xml에 있음)
MariemJab

클래스 경로 아래의 리소스 폴더?
Krishna

1

좋아요, 많은 답변과 매우 정확한 답변을 봅니다. 그러나 아무도 내 문제를 해결하지 못했습니다. 제 경우의 문제는 UNIX 파일 시스템 권한에 루트 소유로 서버에서 편집하고 있던 log4j.properties 파일이 있다는 것입니다. 루트 만 읽을 수 있습니다. 그러나 내가 배포 한 웹 애플리케이션은 tomcat이 기본적으로 Linux 시스템에서 tomcat 사용자로 실행되므로 tomcat이 파일을 읽을 수 없었습니다. 도움이 되었기를 바랍니다. 그래서 솔루션은 log4j.properties 파일이있는 디렉토리에 'chown tomcat : tomcat log4j.properties'를 입력했습니다.


1

web.xml에 log4jExposeWebAppRoot-> false를 추가하십시오. 그것은 나와 함께 작동합니다 :)

<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

나는 같은 문제가 있었다. 동일한 구성 설정 및 동일한 경고 메시지. 나를 위해 일한 것은 : 항목의 순서 변경.

  • 로그 구성 항목 [컨텍스트 매개 변수 및 리스너]를 파일 상단에 [applicationContext.xml 항목 앞에] 놓았고 작동했습니다.

순서가 중요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.