Невозможно использовать logback.groovy, но logback.xml работает
Я хотел настроить Logback с помощью Groovy DSL. Файл очень прост:
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.
Ответы
Ответ 1
Я понял решение, но некоторые вопросы остаются открытыми. Проблема заключалась в том, что у меня не было подходящего Groovy для пути к классам. Я решил сделать пример проекта, чтобы продемонстрировать эту ошибку. Я начал с консольного приложения, используя плагин Gradle "application". Я не включил 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.
ОК, круто. Зависимость отсутствовала - легко исправить. Но почему я не получил ту же ошибку при запуске моего веб-приложения? Добавление зависимостей Groovy разрешило начальную проблему в веб-приложении. Я снял свой проект и создаю соответствующую JIRA. Возможно, Groovy для обнаружения пути к классам не совсем корректно.
Ответ 2
В GroovyCastException "не может быть установлен ConsoleAppender as Appender" все зависит от проблемы загрузчика класса. Какая версия groovy? Не могли бы вы открыть отчет об ошибке включая тестовый пример для воспроизведения этой публикации?
Ответ 3
коллег.
Сегодня я столкнулся с почти такой же проблемой:
- Когда я использую
logback.xml
, все работает отлично
- Когда я использую
logback.groovy
в IntelliJ IDEA, все работает отлично.
- Когда я использую
logback.groovy
при запуске my script из командной строки, у меня появилось много ошибок, например
:
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
Но через пару минут, чтобы найти решение, я понял, что следующая строка до @Grapes
аннотации устраняет проблемы с загрузкой классов @GrabConfig (systemClassLoader = true)
@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')
])