Log4j2 和 Jboss EAP 7:异常记录
Log4j2 and Jboss EAP 7: Exceptions logging
我在 Jboss EAP 7.0.2
上有一个网络应用 运行。在我的应用程序中,我想使用 Log4j2
进行日志记录。所以,我添加了 log4j2
和 log4j-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-部署-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>
Created log4j2.xml(我省略了它的内容,但是它把log写到了文件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
...
问题:
- 如何将应用程序中发生的所有消息和异常定向到 lea.log(我的 log4j2 日志文件)?
- 即使我从我的部署中排除了日志子系统,它是否应该登录到 server.log 文件?
您正在从 REST 端点抛出异常而不处理它。因此,服务器会为您处理无法登录到您的应用程序日志配置的问题。
排除日志子系统将阻止日志子系统处理您的部署。 (这确实意味着您不需要那些模块排除项)。但是服务器本身仍将使用日志子系统中的配置。
如果您想捕获特定类型的异常,您可以使用 javax.ws.rs.ext.ExceptionMapper
记录异常,然后为其创建响应。
我在 Jboss EAP 7.0.2
上有一个网络应用 运行。在我的应用程序中,我想使用 Log4j2
进行日志记录。所以,我添加了 log4j2
和 log4j-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-部署-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>
Created log4j2.xml(我省略了它的内容,但是它把log写到了文件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
...
问题:
- 如何将应用程序中发生的所有消息和异常定向到 lea.log(我的 log4j2 日志文件)?
- 即使我从我的部署中排除了日志子系统,它是否应该登录到 server.log 文件?
您正在从 REST 端点抛出异常而不处理它。因此,服务器会为您处理无法登录到您的应用程序日志配置的问题。
排除日志子系统将阻止日志子系统处理您的部署。 (这确实意味着您不需要那些模块排除项)。但是服务器本身仍将使用日志子系统中的配置。
如果您想捕获特定类型的异常,您可以使用 javax.ws.rs.ext.ExceptionMapper
记录异常,然后为其创建响应。