2016-05-30 148 views
0

我需要將logback添加到我的項目中。 這是我的測試類:如何將logback添加到gradle項目

public class Head implements Runnable { 
    Thread trd; 

    Head() { 
     trd = new Thread(this); 
     trd.start(); 
    } 
    static Logger logger = LoggerFactory.getLogger(Head.class); 

    @Override 
    public void run() { 
     MDC.put("logName", "LOG_NAME"); 
     logger.warn("test1"); 
     logger.info("test2"); 
     logger.error("test"); 
     MDC.remove("logName"); 
    } 

    public static void main(String[] args) { 
     String URL = "logback-test.xml"; 
     System.out.println(ClassLoader.getSystemResource(URL)); 
     int count = 1; 
     while(count<=3){ 
      Head head = new Head(); 
      count++; 
     } 
    } 
} 

這裏是我的logback-的test.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 

<appender name="FILE" class="ch.qos.logback.classic.sift.SiftingAppender"> 

    <discriminator> 
     <key>logName</key> 
     <defaultValue>test</defaultValue> 
    </discriminator> 
    <sift> 
     <appender name="FILE-${logName}" class="ch.qos.logback.core.FileAppender"> 
      <file>D:/tmp/${logName}.log</file> 
      <append>false</append> 
      <layout class="ch.qos.logback.classic.PatternLayout"> 
       <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern> 
      </layout> 
     </appender> 
    </sift> 
</appender> 

<root level="ALL"> 
    <appender-ref ref="FILE" /> 
</root> 

我加入了以下常規的依賴關係:

compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21' 
compile group: 'org.slf4j', name: 'jcl-over-slf4j', version: '1.7.21' 
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.1.7' 
compile group: 'ch.qos.logback', name: 'logback-core', version: '1.1.7' 
compile group: 'ch.qos.logback', name: 'logback-access', version: '1.1.7' 
compile "org.codehaus.groovy:groovy:1.8.9" 

但是當我嘗試運行的主要方法獲得:

file:/D:/my_tests/build/resources/main/logback-test.xml 
    Failed to instantiate [ch.qos.logback.classic.LoggerContext] 
     Reported exception: 
    java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/typehandling/ShortTypeHandling 
at ch.qos.logback.classic.gaffer.GafferConfigurator.run(GafferConfigurator.groovy:59) 
at ch.qos.logback.classic.gaffer.GafferConfigurator$run.callCurrent(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) 
at ch.qos.logback.classic.gaffer.GafferConfigurator.run(GafferConfigurator.groovy:44) 
at ch.qos.logback.classic.gaffer.GafferUtil.runGafferConfiguratorOn(GafferUtil.java:43) 
at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:67) 
at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150) 
at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84) 
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55) 
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150) 
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124) 
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412) 
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357) 
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383) 
at com.aerlingus.uita.utils.Head.<clinit>(Head.java:20) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:264) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:122) 
      Caused by: java.lang.ClassNotFoundException:      org.codehaus.groovy.runtime.typehandling.ShortTypeHandling 
at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
... 20 more 

你能幫我解決這一問題?加入依賴compile group: 'org.codehaus.groovy', name: 'groovy-backports-compat23', version: '2.3.5'

錯誤:

Failed to instantiate [ch.qos.logback.classic.LoggerContext] 
       Reported exception: 
    java.lang.IncompatibleClassChangeError: the number of constructors during runtime and compile time for ch.qos.logback.classic.gaffer.NestingType do not match. Expected -1 but got 2 
at groovy.lang.MetaClassImpl.selectConstructorAndTransformArguments(MetaClassImpl.java:1413) 
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.selectConstructorAndTransformArguments(ScriptBytecodeAdapter.java:234) 
at ch.qos.logback.classic.gaffer.NestingType.$INIT(NestedType.groovy) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.invoke(StaticMetaMethodSite.java:43) 
at org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.callStatic(StaticMetaMethodSite.java:99) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:50) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:157) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:169) 
at ch.qos.logback.classic.gaffer.NestingType.<clinit>(NestedType.groovy) 
at sun.misc.Unsafe.ensureClassInitialized(Native Method) 
at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43) 
at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:142) 
at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1088) 
at java.lang.reflect.Field.getFieldAccessor(Field.java:1069) 
at java.lang.reflect.Field.get(Field.java:393) 
at org.codehaus.groovy.reflection.CachedField.getProperty(CachedField.java:51) 
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1565) 
at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3343) 
at org.codehaus.groovy.runtime.callsite.ClassMetaClassGetPropertySite.getProperty(ClassMetaClassGetPropertySite.java:48) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227) 
at ch.qos.logback.classic.gaffer.PropertyUtil.nestingType(PropertyUtil.groovy:32) 
at ch.qos.logback.classic.gaffer.PropertyUtil$nestingType.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120) 
at ch.qos.logback.classic.gaffer.ComponentDelegate.methodMissing(ComponentDelegate.groovy:39) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
at groovy.lang.MetaClassImpl.invokeMissingMethod(MetaClassImpl.java:830) 
at groovy.lang.MetaClassImpl.invokePropertyOrMissing(MetaClassImpl.java:1128) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1081) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:723) 
at ch.qos.logback.classic.gaffer.ComponentDelegate.invokeMethod(ComponentDelegate.groovy) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:407) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:348) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) 
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145) 
at Script1$_run_closure1.doCall(Script1.groovy:8) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) 
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) 
at Script1$_run_closure1.doCall(Script1.groovy) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233) 
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:272) 
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:903) 
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:39) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112) 
at ch.qos.logback.classic.gaffer.ConfigurationDelegate.appender(ConfigurationDelegate.groovy:143) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90) 
at org.codehaus.groovy.runtime.metaclass.MixinInstanceMetaMethod.invoke(MixinInstanceMetaMethod.java:53) 
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoMetaMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:313) 
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:52) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149) 
at Script1.run(Script1.groovy:7) 
at Script1$run.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112) 
at ch.qos.logback.classic.gaffer.GafferConfigurator.run(GafferConfigurator.groovy:77) 
at ch.qos.logback.classic.gaffer.GafferConfigurator$run.callCurrent(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141) 
at ch.qos.logback.classic.gaffer.GafferConfigurator.run(GafferConfigurator.groovy:44) 
at ch.qos.logback.classic.gaffer.GafferUtil.runGafferConfiguratorOn(GafferUtil.java:43) 
at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:67) 
at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150) 
at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84) 
at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55) 
at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150) 
at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124) 
at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412) 
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357) 
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383) 
at com.aerlingus.uita.utils.Head.<clinit>(Head.java:20) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:264) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:122) 

回答

1

這個問題從一個Groovy版本不兼容造成的。如果您的項目允許,請將Groovy依賴項更新爲最新版本(當前爲2.4.6)。

否則,如果你的項目需要的Groovy 1.8.9,那麼你就需要添加一個依賴於org.codehaus.groovy:groovy-backports-compat23:2.3.5,如所示Gradle 2.3.5 release announcement

[...] So we leveraged this version to add a new artifact, named groovy-backports-compat23 . This artifact shouldn’t be necessary for most of you, but if you face an error like:

Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.typehandling.ShortTypeHandling 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372) 

in your project, then it means that a class has been compiled with Groovy 2.3+ but that you are trying to use it with an older version of Groovy. By adding this jar on classpath, you give a chance to your program to run. This may be particularily interesting for Gradle users that want to use a plugin built on Gradle 2+ on older versions of Gradle and face this error. Adding the following line to their build files should help:

buildscript { 
    // ... 
    dependencies { 
    classpath 'some plugin build on gradle 2' 
    classpath 'org.codehaus.groovy:groovy-backports-compat23:2.3.5' 
    } 
} 

Note that for now, this jar only contains the ShortTypeHandlingClass . Future versions may include more. [...]

+0

謝謝你,我有添加這種依賴性,但現在我得到另一個錯誤:「運行時構造函數的數量和ch.qos.logback.classic.gaffer.NestingType的編譯時間不匹配,預期爲-1但得到2」。完整日誌已更新問題 – khris

+1

您是否確實需要特定版本的groovy?或者你能否將這個依賴關係更新到最新版本(2.4.6)而沒有問題?如果是這樣,你可以刪除這個'compat'依賴。 – tony19

+0

看來舊版本不是必需的,現在沒有錯誤。但我不明白爲什麼日誌不會保存到文件中:D:/ tmp/LOG_NAME – khris