我有一个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
然后我删除了所有引用slf4j
和log4j
(注释掉三行我表现出我的上述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
任何帮助表示赞赏。
你应该只使用一个依赖'编译“给一个尝试org.slf4j:SLF4J-log4j12:1.7.12''而不是所有三个 – nullpointer
的可能的复制http://stackoverflow.com/questions/14024756/slf4j-class -path-contains-multiple-slf4j-bindings – nullpointer
这不起作用:我没有再看到任何日志。我编辑了'log4j.properties'的OP。当我单独删除'compile'org.slf4j:slf4j-log4j12:1.7.12''时,多重绑定消息又回来了。 – Sonny