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

cu6pst1q  于 2021-06-08  发布在  Kafka
关注(0)|答案(12)|浏览(408)

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

wdebmtf21#

对我来说,解决办法很简单。你不需要申报任何东西 web.xml .
因为您的项目是一个web应用程序,所以配置文件应该在 WEB-INF/classes 部署后。我建议您创建一个java资源文件夹( src/main/resources )做到这一点(最好的做法)。另一种方法是将配置文件放在 src/main/java .
注意配置文件名。如果您使用的是xml,则文件名为 log4j.xml ,否则 log4j.properties .

c86crjj0

c86crjj02#

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

log4j.rootLogger=debug,A1
bbmckpt7

bbmckpt73#

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

8ljdwjyq

8ljdwjyq4#

我将log4j.properties放在类路径中的正确位置,但是仍然得到了这个警告以及任何直接使用它的东西。出于某种原因,通过commons日志记录使用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,任何appender,以便进行日志记录。
将控制台附加程序添加到rootlogger会使此抱怨消失。

k2fxgqgv

k2fxgqgv5#

或者,您可以执行我所做的操作,并在加载日志配置文件之前定义记录器。这就像他们说的:“本末倒置。”
在代码中:

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

... 后来

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

修复程序是在配置加载后初始化记录器。
对于极客来说,这是“把笛卡尔的b4 d马”。

lg40wkob

lg40wkob6#

好吧,我看到了很多答案和一些非常正确的答案。但是,没有人能解决我的问题。在我的例子中,问题是unix文件系统权限将我正在服务器上编辑的log4j.properties文件作为root所有。只有根才能读。但是,我部署到tomcat的web应用程序无法读取文件,因为默认情况下,tomcat在linux系统上以用户tomcat的身份运行。希望这有帮助。所以解决方法是输入'chown'tomcat:tomcat log4j.properties'在log4j.properties文件所在的目录中。

mbzjlibv

mbzjlibv7#

当您的 log4j.properties 类路径中不存在。
这意味着你必须移动 log4j.properties 并将输出设置为bin文件夹,以便在运行时 log4j.properties 将从bin文件夹中读取,您的错误将很容易解决。

az31mfrm

az31mfrm8#

在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>
9q78igpj

9q78igpj9#

将这些行放在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>
nfeuvbwi

nfeuvbwi10#

如果要为独立的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);
kkbh8khc

kkbh8khc11#

如果仍然有用,请验证归档文件的名称,它必须是“log4j.properties”或“log4j.xml”(区分大小写),并按照“alain o'dea”的提示进行操作。我也犯了同样的错误,但是在做了这些修改之后,一切都很好。就像一个符咒:-)。希望这有帮助。

jjjwad0x

jjjwad0x12#

我也有同样的问题。相同的配置设置和相同的警告消息。对我起作用的是:改变条目的顺序。
我将日志配置的条目[上下文参数和侦听器]放在文件的顶部[在applicationcontext.xml的条目之前],然后它就工作了。
我想顺序很重要。

相关问题