spring - 使用 Spring Boot 和 logback 进行基本登录的问题

标签 spring logging groovy

我在 Groovy 中有一个简单的 Spring Boot 应用程序。以下是我迄今为止设置的 Gradle 依赖项:

dependencies {
    compile 'org.codehaus.groovy:groovy-all:2.3.11'
    compile 'org.easyrules:easyrules-core:2.2.1-SNAPSHOT'
    compile 'org.easyrules:easyrules-spring:2.2.1-SNAPSHOT'
    compile 'org.easyrules:easyrules-jmx:2.2.1-SNAPSHOT'
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'org.springframework.boot:spring-boot-starter'
    compile 'org.springframework.boot:spring-boot-starter-actuator'
    compile 'org.springframework.boot:spring-boot-starter-logging'
    compile 'ch.qos.logback:logback-classic:1.1.5'
}

这在 1.7.13 版本中引入了 slf4j-api、log4j-over-slf4j、jul-to-slf4j 和 jcl-over-slf4f。

然后在我的助手类中我有这个:

@Component
@PropertySource ("classpath:application.properties")
class RulesHelper {

    private static final Logger log = LoggerFactory.getLogger(RulesHelper.class)

后面是这样的 bean def:

@Bean
def rulesEngine () {
    assert jmxEnabled != null
    if ( !jmxEnabled ) {
        //return std rules engine
        println "returning std rules engine of type ${stdRulesEngine.getClass().name}"
        ruleEngine = stdRulesEngine
        return stdRulesEngine
    } else {
        println "returning jmx rules engine of type ${jmxRulesEngine.getClass().name}"
        //log.debug("hello from logger")
        //assert log

        ruleEngine = jmxRulesEngine
        return jmxRulesEngine  //JmxRulesExtends RulesEngine so should work
    }
}

如果我取消注释掉该断言,当我像这样运行时会收到错误,说找不到org.slf4j.event.LoggingEvent:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.lang.Object]: Factory method 'rulesEngine' threw exception; nested exception is java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
    ... 26 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at org.codehaus.groovy.reflection.CachedClass$3$1.run(CachedClass.java:85)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:82)
    at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:80)
    at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
    at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
    at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:251)
    at groovy.lang.MetaClassImpl.populateMethods(MetaClassImpl.java:361)
    at groovy.lang.MetaClassImpl.fillMethodIndex(MetaClassImpl.java:340)
    at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3224)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:222)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:253)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:263)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:259)
    at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:855)
    at org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:888)
    at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:880)
    at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToBoolean(DefaultTypeTransformation.java:180)
    at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.booleanUnbox(DefaultTypeTransformation.java:69)
    at org.softwood.easyrules.RulesHelper.rulesEngine(RulesHelper.groovy:79)
    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:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
    ... 27 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.slf4j.event.LoggingEvent

我在这里做错了什么?根据我所读到的内容,我认为这会起作用。

最佳答案

那么你知道什么-依赖管理问题-最新的springboot-starter-logging仅使用slf4j-api.1.7.13,

但是,如果您获得我所做的最新 logback logback_classic.1.1.5 ,则 Api 客户端库中的某处存在重大问题,未导出该类 - 这就是找不到它的原因。请参阅logback issue/news

如果您显式添加依赖项

...
compile 'ch.qos.logback:logback-classic:1.1.5'
compile 'org.slf4j:slf4j-api:1.7.16'

到 gradle.build,刷新并重试,一切都开始按自然预期工作。天哪,像往常一样痛苦,因为这些事情通常都是这样的

关于spring - 使用 Spring Boot 和 logback 进行基本登录的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35609130/

相关文章:

java - Hibernate session 问题,新线程从 Grails Controller 启动

java - spring-boot 2.1.0 mongo - CodecConfigurationException : Can't find a codec for class java. time.Year

c# - 在参数替换 C# 后查看确切的 sql

groovy - 从文件中获取整数平均值的最佳方法是什么?

grails - 为什么不能在Grails中导入此Groovy库?

java - 关于 AbstractApplicationContext.getBeansOfType() 和 getBean() 的问题

java - Spring Roo - 将查找器添加到 list.jspx 中的每一行

logging - 如何在Cassandra服务器上跟踪查询?

python - 如何根据记录器名称在 python 中配置和使用特定记录器

maven - 从 Maven 执行外部 groovy 脚本