Невозможно использовать 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.
3 ответа
Я нашел решение, но некоторые вопросы остаются открытыми. Проблема была в том, что у меня не было подходящего 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 по обнаружению пути к классам не совсем корректен.
Коллеги по работе.
Я столкнулся почти с той же проблемой сегодня:
- Когда я использую
logback.xml
все отлично работает - Когда я использую
logback.groovy
в IntelliJ IDEA все работает нормально - Когда я использую
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
Но через пару минут, чтобы найти решение, я понял, что следующая строка перед @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')
])