我创建了一个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.*
之类的通配符,那就太棒了。
@Slf4j
)中定义的myapp
注释或在第三方JAR中定义的任何Groovy类必须遵守其日志记录请注意: Grails之外我绝对崇拜 logback。但根据我的经验,我发现Grails Logback插件严重坏了,所以我对从log4j切换不感兴趣 - >在Grails应用程序中进行logback。
答案 0 :(得分:2)
您确认info 'com.example.myapp'
本质上是com.example.myapp.*
的通配符,因此应该可行。我发现当日志记录没有按预期工作并且记录器的名称可能有误时,为记录器名称添加println语句通常会清除错误配置的内容。例如,在控制器或服务中,只需添加
println "logger name for ${getClass().name} is $log.name"
并在调用该控制器操作或服务方法后在控制台中查找该消息。