java - 日志记录由记录器处理两次

标签 java maven log4j slf4j

我有一个要登录的 Web 应用程序。 logging.properties 文件提供了一些我无法影响的默认日志记录。它记录服务器启动、关闭等。

这些是此类日志的示例(正常的,这里没有错):

2016/01/22 12:25:10  INFO (ApplicationContext.java:671 [ServerService Thread Pool -- 64]) - Initializing Spring root WebApplicationContext
2016/01/22 12:25:13  INFO (ConfigureListener.java:202 [ServerService Thread Pool -- 64]) - Initializing Mojarra 2.1.28-jbossorg-6  for context '/MyServices'
2016/01/22 12:25:15  INFO (DeploymentHandlerUtil.java:137 [ServerService Thread Pool -- 28]) - JBAS015859: Deployed "MyServices.war" (runtime-name : "MyServices.war")
2016/01/22 12:25:15  INFO (BootstrapListener.java:93 [Controller Boot Thread]) - JBAS015874: JBoss EAP 6.4.0.GA (AS 7.5.0.Final-redhat-21) started in 27257ms - Started 485 of 520 services (63 services are lazy, passive or on-demand)

现在我也可以使用我自己的方法登录我的应用程序,指定使用:

private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(PropertiesValues.class);
...
LOG.info("Properties loaded.");

问题是当这些日志被命中时,会导致双重记录,每行都有两个时间戳,两个日志级别,两个来源,例如:

2016/01/22 11:50:49  INFO (AbstractLoggingWriter.java:71 [ServerService Thread Pool -- 111]) - 2016/01/22 11:50:49  INFO (EnvironmentLoader.java:128 [ServerService Thread Pool -- 111]) - Starting Shiro environment initialization.
2016/01/22 11:50:49  INFO (AbstractLoggingWriter.java:71 [ServerService Thread Pool -- 111]) - 2016/01/22 11:50:49  INFO (EnvironmentLoader.java:141 [ServerService Thread Pool -- 111]) - Shiro environment initialized in 125 ms.
...
2016/01/22 11:51:20  INFO (AbstractLoggingWriter.java:71 [http-localhost/127.0.0.1:8443-6]) - 2016/01/22 11:51:20  INFO (PropertiesValues.java:101 [http-localhost/127.0.0.1:8443-6]) - Properties loaded.

注意日志被处理了两次。也就是说——将要打印的每一行都会再次通过记录器运行,从而产生两个时间戳、两个日志级别和两个源。我可以通过更改 log4j.properties 文件中的最后一行来解决这个问题:

log4j.rootLogger=INFO, STDOUT
log4j.additivity.rootLogger=false
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.Target=System.out
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%d{yyyy/MM/dd HH:mm:ss} %5p (%F:%L [%t]) - %m%n

只能是%m但我觉得这是一个糟糕的解决方案,导致源显示为 AbstractLoggingWriter.java:71对于一切。

有没有办法让我的日志显示正确的方法和行号,并按照我选择的方式格式化,而不是服务器?同时,我也不想丢失服务器提供的日志。

我的 Maven 依赖项是:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

最佳答案

我们的应用程序遇到了同样的问题,我们通过在 jboss-deployment-structure.xml 中将以下内容添加到 Web 应用程序的 WEB-INF 中来解决该问题:

<?xml version="1.0" encoding="utf-8"?>
<jboss-deployment-structure>
   <deployment>
       <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
       <exclude-subsystems>  
           <subsystem name="logging" />
       </exclude-subsystems>  
   </deployment>
</jboss-deployment-structure>

关于java - 日志记录由记录器处理两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34938432/

相关文章:

java - Spring Kafka 找不到 Kafka Properties Bean

java - 你需要使用 JDK 运行构建或者有工具 .Jar

java - Log4j 不发送邮件,除非 Thread.sleep

log4j - 级别的特定记录器

java - 简单数学运算符上的奇怪 java 错误

java - 如何在 Netbeans 8.0 中使用 SSL 连接到 mysql

java - Maven项目构建失败

java - Log4J - 测试日志级别有用吗?

java - 用于在多个不同的 javac 任务中指定源/版本的 Ant 快捷方式

java - 使用 jenkins 将 war 文件部署到 jetty