gpt4 book ai didi

logging - org.jboss.logging.Logger 而不是打印在日志中的类名,具体取决于运行时环境

转载 作者:行者123 更新时间:2023-12-01 06:09:38 28 4
gpt4 key购买 nike

我有一个在 JBoss 5.1 上运行并通过 slf4j 使用 log4j 的大型应用程序。当我在本地 docker 容器中测试时,我可以在日志中看到通常的 package.class 名称:

03 Dec 15 09:45:39, DEBUG  my.fancy.app.filters.TicketValidationFilter:doFilter:30 Ticket was verified with data: uniqueID=gfd, idnumber=sdf, mid=11246986.
03 Dec 15 09:45:39, DEBUG my.fancy.app.MyServlet:doGet:30 Request for secret data with uniqueId=gfd
03 Dec 15 09:45:39, WARN my.fancy.app.MyServlet:doGet:36 Could not retrieve SecretData with uniqueId=gfd

但是,当我将相同的代码部署到开发环境(可能不那么干净......)时,我得到:
03 dec 15 10:45:22, DEBUG  org.jboss.logging.Logger:debug:228 Ticket was verified with data: uniqueID=sdg, idnumber=sdf, mid=11738149.
03 dec 15 10:45:22, DEBUG org.jboss.logging.Logger:debug:228 Request for secret data with uniqueId=sdg
03 dec 15 10:45:22, WARN org.jboss.logging.Logger:warn:352 Could not retrieve SecretData with uniqueId=sdg

我已经比较了两种环境中的 jboss-log4j.xml,它们是相同的。我还检查了启动标志以查看是否设置了日志记录提供程序,但它不在这两种环境中。

我接下来应该看哪里?

更新

我还应该提到,以前我们一直直接使用 log4j,所以我们仍然有直接的 log4j 导入和实例化分散在各处。奇怪的是,那些用 log4j 记录的条目在所有环境中都能正确显示,而那些用 slf4j 记录的条目仅在某些环境中显示。这应该是 slf4j 在违规环境中没有真正正确配置的线索。问题是我应该在哪里修复它?

更新 2

这是附加程序配置:
<appender name="MYAPP_FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
<param name="File" value="${jboss.server.log.dir}/myapp.log" />
<param name="Append" value="true" />
<param name="DatePattern" value="'.'yyyy-MM-dd"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd MMM yyy HH:mm:ss}, %-6p %C:%M:%L %m %n" />
</layout>
</appender>

记录器声明:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
public class MyServlet extends HttpServlet {
private Logger log = LoggerFactory.getLogger(MyServlet.class.getName());
...
log.debug("Request for secret data with uniqueId={}", secretDataVO.getUniqueId());
...
}

在 pom.xml 我有:

<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.5.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.10</version>
<scope>provided</scope>
</dependency>

之所以存在对 log4j 的依赖,是因为在应用程序代码的其他地方,我们仍然直接使用 log4j。 slf4j-log4j12 被标记为已提供,因为它是由同一 jboss 实例中的另一个工件加载的。

更新 3

启动jboss时出现错误:

2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR The class "org.apache.log4j.Appender" was loaded by
2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR [BaseClassLoader@14a33aa{vfszip:/my-jboss-root/jboss/server/default/deploy/fancyApp.ear/fancyApp-web.war/}] whereas object of type
2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR "org.jboss.logging.appender.FileAppender" was loaded by [org.jboss.bootstrap.NoAnnotationURLClassLoader@15b0afd].
2015-12-07 16:16:50,127 ERROR [STDERR] log4j:ERROR Could not instantiate appender named "FILE".

其中fancyApp-web.war 是加载slf4j-log4j12 的那个。我之前看到过这个错误,但没有提到它,因为它出现在本地(docker)和开发环境中(甚至在生产环境中......)

最佳答案

尝试使用 LoggerFactory.getLogger(MyServlet.class)如此处所述:http://www.slf4j.org/api/org/slf4j/LoggerFactory.html#getLogger%28java.lang.Class%29

In case the the clazz parameter differs from the name of the caller as computed internally by SLF4J, a logger name mismatch warning will be printed but only if the slf4j.detectLoggerNameMismatch system property is set to true. By default, this property is not set and no warnings will be printed even in case of a logger name mismatch.



还设置了 debug="true"在您的 log4j.xml 中并观察 log4j 初始化。

关于logging - org.jboss.logging.Logger 而不是打印在日志中的类名,具体取决于运行时环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34063809/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com