Groovy Slf4j注释似乎干扰了Grails内置日志记录

时间:2015-10-22 17:18:30

标签: grails logging log4j slf4j

我创建了一个Grails 2.4.5应用程序(grails create-app myapp)并在src/groovy下添加了一堆Groovy类。对于那些需要记录的类,我使用了@Slf4j annotation,如下所示:

package com.example.myapp

import groovy.util.logging.Slf4j

@Slf4j
class MyObject {
    def doSomething() {
        log.info('I'm going to do something now.')
    }
}

同样适用于Grails生成的类,例如控制器和服务(也就是说,我使用所有内容的@Slf4j注释)。我终于准备好在本地myapp运行grails run-app当我这样做时,我看不到任何我的SLF4J语句记录(无论日志级别如何)。

这是我Config.groovy的日志配置:

log4j.main = {
    console name: "stdout", layout: pattern(conversionPattern: "%c{2} %m%n")

    info  'com.example.myapp' // I'm hoping this is a wildcard that actually
                              // means 'com.example.myapp.*'

    error  'org.codehaus.groovy.grails.web.servlet',
           'org.codehaus.groovy.grails.web.pages',
           'org.codehaus.groovy.grails.web.sitemesh',
           'org.codehaus.groovy.grails.web.mapping.filter',
           'org.codehaus.groovy.grails.web.mapping',
           'org.codehaus.groovy.grails.commons',
           'org.codehaus.groovy.grails.plugins',
           'org.codehaus.groovy.grails.orm.hibernate',
           'org.springframework',
           'org.hibernate',
           'net.sf.ehcache.hibernate'
}

我理解Grails使用log4j,但认为Grails附带了自己的SLF4J绑定,因此这些@Slf4j注释应该有效。我尝试将'org.slf4j:slf4j-log4j12:1.7.5'放在我的编译路径上,但这也不起作用(并产生SLF4J错误,抱怨类路径上有多个绑定;这证实了我的理论,即Grails附带了自己的SLF4J绑定)。

我需要做些什么才能让日志工作在这里?这就是我需要的:

  • 我需要为com.me.myapp下的所有包/类配置日志记录,如果我可以在log4j config
  • 中提供com.me.myapp.*之类的通配符,那就太棒了。
  • 使用我的Grails应用程序(@Slf4j)中定义的myapp注释或在第三方JAR中定义的任何Groovy类必须遵守其日志记录

请注意: Grails之外我绝对崇拜 logback。但根据我的经验,我发现Grails Logback插件严重坏了,所以我对从log4j切换不感兴趣 - >在Grails应用程序中进行logback。

1 个答案:

答案 0 :(得分:2)

您确认info 'com.example.myapp'本质上是com.example.myapp.*的通配符,因此应该可行。我发现当日志记录没有按预期工作并且记录器的名称可能有误时,为记录器名称添加println语句通常会清除错误配置的内容。例如,在控制器或服务中,只需添加

即可
println "logger name for ${getClass().name} is $log.name"

并在调用该控制器操作或服务方法后在控制台中查找该消息。