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

标签 logging jboss log4j slf4j

我有一个在 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/

相关文章:

java - 从 Wildfly 发送 jms 消息

node.js - 如何在 NestJs 中使用 Fastify 忽略特定的路由日志记录?

amazon-web-services - AWS CloudWatchLog 限制

python - 如何使用 awk 或 grep 在日志文件中捕获整个 Python 回溯?

java - Kafka Producer 注册 AppInfo mbean 时出错并且没有创建消息

java - Elasticsearch "StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath."

linux - 如何将部分时间戳添加到 Fluentd 输出文件格式

jakarta-ee - WildFly 部署失败 - "JBAS014771: Services with missing/unavailable dependencies"

第三方应用程序(如 apache zookeeper)中的 Log4j 漏洞

java - 如何自定义 log4j2 RollingFileAppender?