【问题标题】:org.jboss.logging.Logger instead of class names printed in log depending on runtime environmentorg.jboss.logging.Logger 而不是根据运行时环境打印在日志中的类名
【发布时间】:2015-12-03 10:42:03
【问题描述】:

我有一个大型应用程序在 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)和开发环境中(甚至在生产环境中......)

【问题讨论】:

  • 请附上您的 slf4j 配置文件(主要用于日志格式)并展示您如何声明您的记录器。此外,您应该重新检查您的应用程序依赖项,以便它们包含 slf4j 和 log4j 所需的文件。您使用的是旧版 log4j 吗?
  • @Taavi:查看添加的信息。我不知道您所说的“旧版”log4j 是什么意思。

标签: logging jboss log4j slf4j


【解决方案1】:

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

如果 clazz 参数与调用者的名称不同,则为 由 SLF4J 内部计算,记录器名称不匹配警告将是 打印但仅当 slf4j.detectLoggerNameMismatch 系统属性 设置为真。默认情况下,此属性未设置且没有警告 即使在记录器名称不匹配的情况下也会打印。

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

【讨论】:

  • 为什么要改变什么?您的意思是我应该查看启用调试时是否应该在日志中出现某些特定错误?
  • 是的,您应该检查您的日志记录环境是如何设置的,抱歉没有明确指出。
【解决方案2】:

将生产环境的调试器设置为 true 并在配置文件中设置。

【讨论】:

  • 您的意思是获取调试日志记录?我应该寻找什么?你在说哪个配置文件?
  • JBoss_HOME\server\default\conf\jboss-log4j.xml
  • 这可能会给你一些见解:community.jboss.org/thread/200818?tstart=0
猜你喜欢
  • 2021-04-08
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2021-12-22
  • 2012-02-19
  • 2017-02-23
相关资源
最近更新 更多