13

Groovy DSL を使用して Logback を構成したかったのです。ファイルは非常に単純です。

import ch.qos.logback.classic.encoder.PatternLayoutEncoder
import ch.qos.logback.core.ConsoleAppender
import static ch.qos.logback.classic.Level.DEBUG
import static ch.qos.logback.classic.Level.INFO

appender("stdout", ConsoleAppender) {
    encoder(PatternLayoutEncoder) {
        pattern = "%d %p [%c] - <%m>%n"
    }
}

root(INFO, ["stdout"])

Gradle を使用してアプリケーションをビルドし、jettyRun で実行します。次のエラーが表示されます。

Failed to instantiate [ch.qos.logback.classic.LoggerContext]
Reported exception:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'ch.qos.logback.core.ConsoleAppender[null]' with class 'ch.qos.logback.core.ConsoleAppender' to class 'ch.qos.logback.core.Appender'
    at  org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:360)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:599)
at ch.qos.logback.classic.gaffer.ConfigurationDelegate.appender(ConfigurationDelegate.groovy:119)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
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:308)
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)

ただし、同等の XML 構成に切り替えると、すべてが機能します。私は何を間違っていますか?

Logback 1.0.0 を使用します。Logback 1.0.3 で試してみました。

4

3 に答える 3

14

解決策を見つけましたが、いくつかの疑問が未解決のままです。問題は、クラスパスに適切な Groovy がなかったことです。このバグを示すサンプル プロジェクトを作成することにしました。Gradle の「アプリケーション」プラグインを使用したコンソール アプリケーションから始めました。依存関係として Groovy を含めませんでした。

apply plugin: 'application'

repositories {
    mavenCentral()
}

ext.logbackVersion = '1.0.3'
ext.slf4jVersion = '1.6.4'

dependencies {
    compile "ch.qos.logback:logback-classic:$ext.logbackVersion"
    compile "org.slf4j:jcl-over-slf4j:$ext.slf4jVersion"
    //runtime "org.codehaus.groovy:groovy:1.8.6" // the problem was here
}

mainClassName = "org.test.Main"

これによりエラーが発生しましたが、これは非常に簡単です。

|-ERROR in ch.qos.logback.classic.LoggerContext[default] - Groovy classes are not available on the class path. ABORTING INITIALIZATION.

うんいいね。依存関係がありませんでした - 簡単に修正できます。しかし、Web アプリケーションを実行したときに同じエラーが発生しなかったのはなぜでしょうか? Groovy の依存関係を追加することで、Web アプリケーションの最初の問題が解決されました。プロジェクトを削除して、対応する JIRA を作成します。おそらく、Groovy のクラスパス検出は正確ではありません。

于 2012-06-13T12:51:42.440 に答える
1

GroovyCastException の「ConsoleAppender を Appender としてキャストできません」には、クラス ローダーの問題がすべて含まれています。これはどのバージョンの groovy ですか? この問題を再現するためのテスト ケースを含むバグ レポートを開いていただけますか?

于 2012-06-12T14:04:52.957 に答える
0

同僚。

今日、ほぼ同じ問題に直面しました。

  • 使用するとlogback.xmlすべて正常に動作します
  • IntelliJ IDEA で使用するlogback.groovyと、すべてが正常に動作します
  • logback.groovyコマンドラインからスクリプトを開始するときに使用すると、次のような多くのエラーが発生しました

:

D:\Projects\PRDMonitoring\sources>groovy tray.groovy PRD
Failed to instantiate [ch.qos.logback.classic.LoggerContext]
Reported exception:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script1.groovy: 2: unable to resolve class ch.qos.logback.classic.filter.LevelFilter
@ line 2, column 1.
   import ch.qos.logback.classic.filter.LevelFilter
   ^
Script1.groovy: -1: unable to resolve class ch.qos.logback.classic.encoder.PatternLayoutEncoder
 @ line -1, column -1.
Script1.groovy: 3: unable to resolve class ch.qos.logback.core.ConsoleAppender
 @ line 3, column 1.
   import ch.qos.logback.core.ConsoleAppender
   ^
Script1.groovy: -1: unable to resolve class ch.qos.logback.classic.Level
 @ line -1, column -1.
Script1.groovy: 6: unable to resolve class ch.qos.logback.core.spi.FilterReply
 @ line 6, column 1.
   import static ch.qos.logback.core.spi.FilterReply.ACCEPT
   ^
Script1.groovy: 7: unable to resolve class ch.qos.logback.core.spi.FilterReply
 @ line 7, column 1.
   import static ch.qos.logback.core.spi.FilterReply.DENY

しかし、私が理解した解決策を見つけるために数分後、注釈の前の次の文字列は @GrabConfig(systemClassLoader=true)をロードするクラスの問題を修正します@Grapes

@GrabConfig(systemClassLoader=true)
@Grapes([
    @Grab(group = 'org.codehaus.groovy.modules.http-builder', module = 'http-builder', version = '0.6'),
    @Grab(group = 'org.apache.commons', module='commons-lang3', version='3.0'),
    @Grab(group = 'commons-io', module = 'commons-io', version = '2.4'),
    @Grab(group = 'joda-time', module = 'joda-time', version = '2.9.4'),
    @Grab(group = 'ch.qos.logback', module = 'logback-classic', version = '1.1.7'),
    @Grab(group = 'ch.qos.logback', module = 'logback-core', version = '1.1.7')
])
于 2016-09-03T18:36:49.977 に答える