2015-12-29 27 views
0

我有一个webapp运行在Jetty 9.3.6 ${jetty.base}设置为/opt/mybase/。我的web应用程序使用slf4j我用log4j作为实际的日志框架,所以在我的web应用程序源的记录语句如下:码头9.1+:如何让我的webapp日志与log4j/slf4j

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class SillyClass 
{ 
    private static final Logger log = LoggerFactory.getLogger (SillyClass.class.getName()); 

    ... 

    public static void foo() 
    { 
     if (error()) 
     { 
      log.error ("ERROR"); 
     } 
     else 
     { 
      log.info ("NOT an error"); 
     } 
    } 

    ... 

} 

在我gradle这个build文件,我这样做:

dependencies { 

... 
compile 'org.slf4j:slf4j-api:1.7.12' 
compile 'org.slf4j:slf4j-log4j12:1.7.12' 
compile 'log4j:log4j:1.2.17' 
... 
} 

这种配置适用于另一种(非Jetty,非webapp)使用相同日志记录框架的Java项目;我可以使用${project.home}/src/main/resources/log4j.properties来控制日志的输出。

无论如何,当我搬到码头时,我按照指示here来点;但只要我这样做,我就打到multiple-bindings error。要纠正这一点,我删除了我的gradle这个build文件的slf4j引用,但导致错误:

java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of org/eclipse/jetty/webapp/WebAppClassLoader) of the current class, org/slf4j/LoggerFactory, and the class loader (instance of org/eclipse/jetty/start/Classpath$Loader) for the method's defining class, org/slf4j/impl/StaticLoggerBinder, have different Class objects for the type org/slf4j/ILoggerFactory used in the signature 

然后我删除了所有引用slf4jlog4j(注释掉三行我表现出我的上述build.gradle ),但我看到的错误仍然是一样的。我究竟做错了什么?

/opt/mybase/resources/log4j.properties文件:

log4j.rootLogger=TRACE, FILE 
log4j.appender.FILE=org.apache.log4j.FileAppender 
log4j.appender.FILE.File=/opt/mybase/logs/jetty.log 
log4j.appender.FILE.Append=false 
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.ConversionPattern= %d{dd MMM yyyy HH:mm:ss.SSS} %l %m%n 

任何帮助表示赞赏。

+1

你应该只使用一个依赖'编译“给一个尝试org.slf4j:SLF4J-log4j12:1.7.12''而不是所有三个 – nullpointer

+0

的可能的复制http://stackoverflow.com/questions/14024756/slf4j-class -path-contains-multiple-slf4j-bindings – nullpointer

+0

这不起作用:我没有再看到任何日志。我编辑了'log4j.properties'的OP。当我单独删除'compile'org.slf4j:slf4j-log4j12:1.7.12''时,多重绑定消息又回来了。 – Sonny

回答

0

嗯,这是我真正尴尬的错误。我相信主要的问题不是log4jslf4j或在码头的配置。我认为这工作得很好。此外,尽管多个绑定,码头服务器实际上选择在码头日志这里显示东西

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/tmp/jetty-0.0.0.0-443-webapp.war-_webapp-any-8458003046853847474.dir/webapp/WEB-INF/lib/slf4j-log4j12- 1.7.12.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [jar:file:/opt/mybase/webapp/lib/logging/slf4j-log4j12- 1.6.6.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 [org.slf4j.impl.Log4jLoggerFactory] 

而且,如果依赖已经日志记录内置的,你的运气,这取决于如何保持良好的东西是的,我想你会有冲突。至少,我知道在这种情况下无法防止这种情况发生。

嗯,真正的问题是,webapp没有自己的log4j.properties(如果您使用gradle,这将在$(projectHome)/src/main/resources/log4j.properties)。我补充说,我的项目和我的日志记录更有意义(即我看看它应该在哪里,在/opt/mybase/logs/my-silly-webapp-log.txt

最后,我报告的崩溃是无关的(在评论中,在12月29日),并且与Jetty 9.3.6 bug有关,它仍然没有解决,它出现了,尽管在Jetty bug db for 9.3.6中调用了解决方案,但是抛出的错误是在我最初报告的multiple_bindings错误之后立即出现了这些错误,它们并不相关,它显示出来了,我无法找到Jetty中的确切错误当我写这篇文章的时候,DB错误,但是最后一篇文章ecked这个bug(大约一个星期前),当码头log4j.properties(在/opt/mybase/resources/log4j.properties)已设定的问题是rootLoggerDEBUG(得到了从该bug的评论)。当我的rootLogger在Jetty log4j.properties设置为DEBUG时,我能够重现错误(websocket应用本身工作正常,尽管Jetty日志相关崩溃)。通过将rootLogger对于码头log4j.properties更改为INFO或更低,我能够确认问题消失。我会在Jetty的bug DB中提出它。

希望这可以帮助别人。