java - 未加载 log4j2 配置

标签 java tomcat logging log4j2

你能帮我找出配置中遗漏的步骤吗?

我正在尝试将记录器添加到我非常简单的 Web 应用程序中:为此,我正在使用 log4j2 (beta9)。

我写下我的log4j2.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} /%L/[%M] - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="prova.Hello" level="trace" additivity="false">
          <AppenderRef ref="Console"/>
        </Logger>
        <Logger name="servletstest.TestLogger" level="trace" additivity="false">
          <AppenderRef ref="Console"/>
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

我把它放在WEB-INF文件夹里。

然后我有一个简单的 servlet,它执行以下操作

response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
    /* TODO output your page here. You may use following sample code. */
    out.println("<!DOCTYPE html>");
    out.println("<html>");
    out.println("<head>");
    out.println("<title>Servlet TestLogger</title>");            
    out.println("</head>");
    out.println("<body>");
    out.println("<h1>Servlet TestLogger at " + request.getContextPath() + "</h1>");
    out.println("</body>");
    out.println("</html>");
    logger.error("error");
    logger.info("info");
    logger.trace("trace");
    logger.debug("debug");
} finally {
    out.close();
}

如您所见,这只是尝试查看记录器是否按预期工作,但事实并非如此。 通过阅读这里 web app我不需要配置我的应用程序的 web.xml,因为它运行 servlet 3.0,事实上,如果我尝试添加配置,我会收到以下错误

javax.servlet.UnavailableException: In a Servlet 3.0+ application, you must not define a log4jServletFilter in web.xml. Log4j 2 defines this for you automatically.

但它似乎没有加载 log4j2 配置文件,因为我期望的输出类似于

10:57:55.490 [http-bio-8084-exec-5] ERROR servletstest.TestLogger - error
10:57:55.490 [http-bio-8084-exec-5] INFO servletstest.TestLogger - info
10:57:55.490 [http-bio-8084-exec-5] TRACE servletstest.TestLogger - trace
10:57:55.490 [http-bio-8084-exec-5] DEBUG servletstest.TestLogger - debug

相反,我只得到

10:57:55.490 [http-bio-8084-exec-5] ERROR servletstest.TestLogger - error

看起来无法加载 xml 文件,它默认将记录器级别设置为仅错误。 在同一个网页上写着

In Tomcat 7 <7.0.43 you will need to change catalina.properties and remove "log4j*.jar" from the jarsToSkip property. You may need to do something similar on other containers if they skip scanning Log4j JAR files.

所以我编辑了 catalina.properties 因为我运行的是 tomcat 7.0.41 并且我从 jartoskip 属性中删除了 log4j*.jar。

我做错了什么?

顺便说一句,在 web.xml 中我有这个

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <display-name>test</display-name>
    <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>prova</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>TestLogger</servlet-name>
        <servlet-class>servletstest.TestLogger</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>TestLogger</servlet-name>
        <url-pattern>/TestLogger</url-pattern>
    </servlet-mapping>
     <listener>
        <listener-class>org.apache.logging.log4j.core.web.Log4jServletContextListener</listener-class>
    </listener>

</web-app>

您会注意到 version 是 2.5 而不是正确的 3.0 也许这在某种程度上影响了我?还是 Jersey 配置?

编辑: 我再次尝试并将 web.xml 更改为以下内容,以便拥有 3.0 版的 Web 应用程序,但它不会加载配置。我做错了什么?

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>Prova</servlet-name>
        <servlet-class>test.Prova</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Prova</servlet-name>
        <url-pattern>/Prova</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

在此先感谢您的帮助。

最佳答案

正如我在评论中猜测的那样,它需要放在WEB-INF/classes中,而不是WEB-INF

关于java - 未加载 log4j2 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19874820/

相关文章:

java - 日志输出中的奇怪符号

mysql - 为什么我的 Google Cloud SQL (MySQL) 库每秒收到多个请求(写入),而我的应用程序什么都不做?

linux - 如何在 linux 中创建虚拟设备?

java - Spring Boot requestDataValueProcessor Bean 定义冲突

java - Java 中的 cometd HTTP 模式

eclipse - 将 WebDSL 应用程序部署到 Tomcat v6.0 时出现的问题

java - Tomcat 应用程序作为使用 TLSv1.2 的另一台服务器的客户端

java - 如何以 Scanner 方法 "hasNext"作为条件退出 java 中的 while 循环?

java - 抽象类中的可选方法实现

java - 如何在文本文件中的两个日期之间进行搜索??? HashMap ?