SLF4J Logback替代日志记录器

6

我不能再使用gradle任务`jettyRun`启动我的记录器。多个绑定的第一个问题不是问题。但现在(升级到gradle 1.4后,我猜)我的记录器没有启动。slf4j文档说要通过编程方式重置上下文,但我更喜欢通过配置来做,因为jettyRun仅用于开发。

$ gradle jettyRun
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jettyRun
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/gradle-1.4/lib/logback-classic-1.0.9.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/bertrand/.gradle/caches/artifacts-23/filestore/ch.qos.logback/logback-classic/1.0.9/jar/258c3d8f956e7c8723f13fdea6b81e3d74201f68/logback-classic-1.0.9.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
SLF4J: The following loggers will not work because they were created
SLF4J: during the default configuration phase of the underlying logging system.
SLF4J: See also http://www.slf4j.org/codes.html#substituteLogger
SLF4J: org.yajug.users.api.MembershipController
SLF4J: org.yajug.users.json.Serializer
SLF4J: org.yajug.users.api.MemberController
SLF4J: org.yajug.users.service.MemberServiceImpl
SLF4J: org.yajug.users.persistence.MongoConnector

我也在我的 IDE 中嵌入了 Tomcat 7 进行测试,结果出现了相同的问题。这似乎与 Gradle jettyRun 或多重绑定无关。 - krampstudio
1个回答

5

我终于找到了问题所在:

  • 日志上下文是惰性初始化的,在第一次调用日志记录器时才会初始化。
  • 在我的Web应用程序环境中(一个仅进行异步调用的单页面Web应用程序),第一页调用了2个异步请求
  • 每个请求都有一个日志记录器,并且初始化是并发进行的,这就是为什么我的某些日志记录器实现被替换为nop实现的原因。
  • 通过在应用程序启动时添加一个日志记录器调用,可以正确初始化上下文

你是怎样在应用程序启动时添加日志记录器的调用的?我尝试使用ServletContextListener,但它没有起作用。你在哪里添加了这个日志记录器的调用? - Jonas Fagundes
由于我正在使用Guice,第一个调用是由GuiceServletContextListener进行的。如果有帮助的话,我的源代码可以在Github上找到:https://github.com/krampstudio/YajMember - krampstudio
这纯粹是胡说八道。SLF4J 存在一个已记录的 bug:http://bugzilla.slf4j.org/show_bug.cgi?id=176。将日志初始化代码放入静态块中,或在该静态块中运行 LoggerFactory.getLogger("ROOT") 或类似操作,可能会起作用。 - ingyhere
Bugzilla的链接已经失效了。该问题的新位置是http://jira.qos.ch/browse/SLF4J-167。 - Joe23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接