log4j:WARN在web.xml中找不到记录器的附加程序


80

我已经将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.

我错过了什么?

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

Answers:


43

如果这是整个log4j.properties文件,则看起来您从未真正创建过记录器。您需要这样的一行:

log4j.rootLogger=debug,A1

1
@Kaffiene:似乎是您没有阅读整个问题(在这种情况下,作者对问题的评论之一提供了答案所涉及的信息)。@CodeGoat:+1用于阅读所有评论。
弗朗西斯科·阿尔瓦拉多

@FranciscoAlvarado我log4j.properties在类路径中有文件,但仍警告控制台中的显示。
UdayKiran Pulipati 2014年

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()方法进行访问。根目录没有附加默认附加程序。

这意味着您需要为根记录器指定一些附加器,任何附加器,以使记录发生。

将该控制台附加程序添加到rootLogger可使此投诉消失。


1
我可以在哪里粘贴。
UdayKiran Pulipati 2014年

@udaykiranpulipati,您可以将其粘贴到log4j.properties中。如果您没有log4j.properties,则使用SBT / Gradle / Maven / etc在src / main / resources /中创建它。否则,将其放置在类路径的根目录下(也许在src /中)。
2014年

19

当您的 log4j.properties不在类路径中。

这意味着您必须将移至log4j.propertiessrc文件夹并将输出设置为bin文件夹,以便在运行时log4j.properties从bin文件夹中读取信息,并且可以轻松解决错误。


1
我在桌面应用程序(Applet)中有同样的问题。文件log4j.properties已经在src文件夹中。如何“将输出设置到bin文件夹”?
Dilshad Rana 2015年

7

如果log4j在任何地方都找不到文件“ log4j.properties”或“ log4j.xml”,则会看到此警告。


2
我确认位置正确。因为当我将log4j.properties重命名为其他名称时,它给出了错误
cometta

7

或者,您可能正在做我所做的事情,并在加载日志配置文件之前定义了记录器。就像他们说的那样:“把马车放在马前。”

在代码中:

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

... 稍后的

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

解决方法是在加载配置后初始化记录器。

对于极客们来说,这是“投入笛卡尔b4 d马”。


5

如果要为独立的log4j应用程序配置,则可以使用BasicConfigurator。该解决方案不适用于像Spring环境这样的Web应用程序。

您需要写-

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

就我而言,解决方案很容易。您无需在中声明任何内容web.xml

因为您的项目是Web应用程序,所以配置文件应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。这将来自类路径。
克里希纳2014年

你在classes文件夹中添加了xml文件吗?
克里希纳2014年

我的log4j在src / main / resources / log4j.xml下(我正在使用spring集成,而我的配置文件在src / min / resources / META-INF / spring / integration / spring-integration-context.xml下)
MariemJab

在classpath下的资源文件夹?
克里希纳

1

好的,我看到了很多答案,有些非常正确。但是,没有一个解决我的问题。在我的情况下,问题是UNIX文件系统权限拥有我正在服务器上编辑的log4j.properties文件,并由root拥有。并且只能由root读取。但是,我正在部署的Web应用程序是tomcat无法读取文件,因为tomcat默认情况下以用户tomcat在Linux系统上运行。希望这可以帮助。因此解决方案是在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条目之前]并起作用。

我想这个命令很重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.