【问题标题】:Log4j2 and Jboss EAP 7: Exceptions loggingLog4j2 和 Jboss EAP 7:异常记录
【发布时间】:2016-11-07 13:53:13
【问题描述】:

我有一个在 Jboss EAP 7.0.2 上运行的网络应用程序。在我的应用程序中,我想使用 Log4j2 进行日志记录。所以,我添加了log4j2log4j-slf4j-impl 作为依赖项:

build.gradle

compile 'org.apache.logging.log4j:log4j-core:2.7'
compile 'org.apache.logging.log4j:log4j-api:2.7'
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.7'

放入文件jboss-deployment-structure.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="logging" />
        </exclude-subsystems>
        <exclusions>
            <module name="org.apache.commons.logging" />
            <module name="org.apache.log4j" />
            <module name="org.jboss.logging" />
            <module name="org.jboss.logging.jul-to-slf4j-stub" />
            <module name="org.jboss.logmanager" />
            <module name="org.jboss.logmanager.log4j" />
            <module name="org.slf4j" />
            <module name="org.slf4j.impl" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

创建了log4j2.xml(我省略了它的内容,但是它把日志写入文件lea.log)。

另外,我有 TestRestService

@Path("/test")
public class TestRestService {
    private Logger logger  = LogManager.getFormatterLogger(TestRestService.class);
    private org.slf4j.Logger slf4jLogger = LoggerFactory.getLogger(TestRestService.class);

    @GET
    @Path("/logger")
    public void testLogger() {
        logger.info("Log4j2 log");
        slf4jLogger.info("SLF4J log");
        throw new RuntimeException("Test");
    }
}

此测试方法写入lea.log

2016-11-07 15:25:37.673 [default task-7] INFO  ru.rshb.test.TestRestService - Log4j2 log
2016-11-07 15:25:37.673 [default task-7] INFO  ru.rshb.test.TestRestService - SLF4J log

但它不会记录异常!

在 server.log 中我看到:

2016-11-07 15:25:37,673 INFO  [stdout] (default task-7) INFO  - Log4j2 log

2016-11-07 15:25:37,673 INFO  [stdout] (default task-7) INFO  - SLF4J log

2016-11-07 15:25:37,674 ERROR [io.undertow.request] (default task-7) UT005023: Exception handling request to /lea-core/rest/test/logger: org.jboss.resteasy.spi.UnhandledException: java.lang.RuntimeException: Test
...

问题:

  1. 如何将我的应用中发生的所有消息和异常定向到 lea.log(我的 log4j2 日志文件)?
  2. 即使我从部署中排除了日志记录子系统,它是否会记录到 server.log 文件?

【问题讨论】:

    标签: logging jboss log4j2 jboss-eap-7


    【解决方案1】:

    您正在从 REST 端点抛出异常而不是处理它。因此,服务器会为您处理无法登录到您的应用程序日志配置的问题。

    排除日志子系统将阻止日志子系统处理您的部署。 (这确实意味着您不需要这些模块排除项)。然而,服务器本身仍将使用来自日志子系统的配置。

    如果您想捕获特定类型的异常,您可以使用javax.ws.rs.ext.ExceptionMapper 记录异常,然后为其创建响应。

    【讨论】:

    • 感谢您的回答。在我的应用程序中捕获所有异常对我没有吸引力。我想要实现的是使用 Log4j2 的路由日志记录功能(或 SiftingAppernder,因为它在 Logback 中被调用)。据我了解,默认日志子系统中没有筛选功能。所以,我想,对我来说最好的选择是启用 Logback 作为服务器日志框架(例如它描述的here)。对吗?
    • 这可能适用于 WildFly 本身,但如果其他依赖项使用 log4j 或 JUL,您可能无法将这些日志消息定向到 logback。
    • 我觉得有点奇怪,不能在EAP中使用log4j2!
    • 您可以在应用程序的 EAP 中使用 log4j2。但是,服务器组件不会使用 log4j2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多