当前位置: 首页 > 知识库问答 >
问题:

未加载log4j2配置

柯波峻
2023-03-14

你能帮我找出配置中缺少的步骤吗?

我正试图将logger添加到我非常简单的web应用程序中:为了做到这一点,我使用了log4j2 (beta9)。

我写下了我的<code>log4j2.xml<code>如下

<?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配置文件,因为输出I excpect类似于

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文件,并且默认情况下,它将记录器级别设置为仅出错。在同一个网页上写着

雄猫 7

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

我做错了什么?

顺便说一下,在网上。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>

您可以注意到,<code>版本</code>是2.5,而不是3.0。这可能会影响我吗?还是球衣配置?

编辑:我再次尝试并将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>

提前感谢您的帮助。

共有2个答案

柯易安
2023-03-14

如果您使用eclipse ide进行开发,您可以将log4j2.xml文件放在src文件夹中。

施文彬
2023-03-14

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

 类似资料:
  • 问题内容: 我将log4j2.xml配置文件设置为每30秒检查一次: 是否可以以编程方式告诉log4j2检查配置中的更改而不是超时? 注意: 我不想以编程方式加载指定配置文件的配置,我只想告诉log4j2检查MonitorInterval过期之前已加载的配置文件。 谢谢! 问题答案: 看来我找到了解决方案: 有人看到任何错误/副作用吗?

  • 我已经将log4j从1.2.17升级到了2.16.0。因此我不得不重写我的log4j。并将其重命名为log4j2.xml。我已经做了必要的改变。然而,我的新配置似乎没有加载。我试图通过两个web配置log4j。xml: 和。两种方法都失败了,我在mylog.log文件中没有任何日志。但是当在本地运行应用程序时,控制台会显示日志。 这是我的log4j2.xml: 我尝试使用以下工具调试log4j配置

  • 我正在将一些web应用程序从log4j1.12迁移到Log4j2。由于公司政策,我们的log4j。xml文件位置在应用服务器中配置为URL,应用程序必须使用JNDI获取它们。我们实现了一个,它允许我们以这种方式初始化log4j基础结构: 但是,随着log4j2api的更改,这将无法再使用。Log4j2提供了lo4j2web。jar模块,它使用初始化库。这将调用,负责获取配置文件的URI。 有什么方

  • 我升级到Log4j到Log4j2在我的项目。我已经把log4j2.properties放在类路径中,并加载它。尽管日志不是根据log4j2.properties.中定义的属性来的 例如,我将属性设置为 但是日志打印为 2020-05-20 16:12:43.061调试58312---[main]o.s.c.a.ClassPathBeanDefinitionScanner:已识别的候选组件类:文件[

  • 问题内容: 我想以编程方式从应用程序中加载Log4j2 XML配置文件。 试过这个: 还有这个: 但是什么都没有。 问题答案: 自己找到答案。有人可能会觉得有用。

  • 我试图使用嵌入Java应用程序中的Log4j2的XML配置文件,但该文件不起作用。 代码: 错误: 线程“main”java中出现异常。lang.ClassCastException:org。阿帕奇。登录中。log4j。果心配置。无法将XMLConfiguration转换为组织。阿帕奇。登录中。log4j。果心配置。中的配置工厂。枪战。发射前。服务器主要的main(main.java:62)