log4j:WARN在web.xml中找不到logger的appender

com*_*tta 79 java spring log4j spring-mvc

我已经将log4jConfigLocation放在web.xml中,但我仍然收到以下警告:

log4j:WARN No appenders could be found for logger ?
    ? (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

<?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>
Run Code Online (Sandbox Code Playgroud)

Cod*_*oat 43

如果这是整个log4j.properties文件,看起来你实际上从未真正创建过记录器.你需要一条线:

log4j.rootLogger=debug,A1
Run Code Online (Sandbox Code Playgroud)


Ala*_*Dea 29

我将log4j.properties放在类路径中的正确位置,并且仍然使用直接使用它的任何内容得到此警告.由于某些原因,使用log4j通过commons-logging的代码似乎没问题.

如果你有:

log4j.rootLogger=WARN
Run Code Online (Sandbox Code Playgroud)

将其更改为:

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
Run Code Online (Sandbox Code Playgroud)

根据http://logging.apache.org/log4j/1.2/manual.html:

根记录器是匿名的,但可以使用Logger.getRootLogger()方法访问.root没有附加默认的appender.

这意味着您需要为根记录器指定一些appender,任何appender以使日志记录发生.

将该控制台 appender 添加到rootLogger会使此投诉消失.


小智 18

当您log4j.properties不在类路径中时,您可能会收到此错误.

这意味着您必须移动log4j.properties到src文件夹并将输出设置为bin文件夹,以便在运行时log4j.properties从bin文件夹中读取,并且您的错误将很容易解决.


Aar*_*lla 7

如果log4j无法在任何地方找到"log4j.properties"或"log4j.xml"文件,您会看到此警告.

  • 我确认位置是正确的.当我将log4j.properties重命名为其他名称时,它会给出错误 (2认同)

小智 7

或者,您可以执行我所做的操作,并在加载日志配置文件之前定义记录器.这就像他们说的那样:"把车放在马前."

在代码中:

public static Logger logger = Logger.getLogger("RbReport");
Run Code Online (Sandbox Code Playgroud)

... 稍后的

PropertyConfigurator.configure(l4j);
logger = Logger.getLogger("RbReport");
Run Code Online (Sandbox Code Playgroud)

修复是在加载配置后初始化记录器.

对于极客来说,它是"放笛卡尔马d4马".


小智 5

如果要配置独立的log4j应用程序,可以使用BasicConfigurator.此解决方案不适用于Spring环境等Web应用程序.

你需要写 -

BasicConfigurator.configure();
Run Code Online (Sandbox Code Playgroud)

要么

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