向Grails类添加记录器
我使用以下方法从Grails应用程序中的类访问记录器实例: 在Grails人工制品(控制器、服务、域类等)中,我只使用Grails添加的记录器,例如向Grails类添加记录器,grails,logging,slf4j,Grails,Logging,Slf4j,我使用以下方法从Grails应用程序中的类访问记录器实例: 在Grails人工制品(控制器、服务、域类等)中,我只使用Grails添加的记录器,例如 class MyController { def someAction() { log.debug "something" } } 对于src/groovy下的类,我用@groovy.util.logging.Slf4j注释它们,例如 @Slf4j class Foo { Foo() { log.debug "log
class MyController {
def someAction() {
log.debug "something"
}
}
对于src/groovy
下的类,我用@groovy.util.logging.Slf4j
注释它们,例如
@Slf4j
class Foo {
Foo() {
log.debug "log it"
}
}
在这两种情况下,记录器的行为似乎都正常,但记录器的类别不同,这让我有点不安。当我使用注释时,记录器的类是org.slf4j.impl.grailsllog4jloggeradapter
,但当我使用自动添加到Grails artefacts的记录器时,类是org.apache.commons.logging.impl.SLF4JLog
是否有一种推荐的(或更好的)方法可以将记录器添加到Grails类中?您是否尝试过@Log4j(用于Log4j)
我看不出你所描述的有任何问题。SLF4J不是日志框架,它是日志框架包装器。但除了Grails类中的一些特定于Grails的钩子之外,它们都实现了相同的接口,并最终委托给实际实现库(通常是Log4j)中的相同记录器/附加器/等等 但我很确定的是日志类别/名称不同,因为您需要根据记录器名称的变化来配置底层库。对于注释,记录器名称与包的完整类名相同。Grails添加了一个前缀,该前缀基于工件类型。我总是忘记命名约定,但是知道记录器名称的一个快速方法是记录它;将此项添加到将在运行时访问的类中:
println log.name
它将打印完整的记录器名称(使用println
而不是log
方法,以避免可能导致消息无法被记录的潜在错误配置问题)
我喜欢保持事情的简单性和一致性,并且知道如何使用它,所以我跳过包装器库,直接使用Log4j。访问记录器很容易。导入类
import org.apache.log4j.Logger
然后将其添加为类字段:
Logger log = Logger.getLogger(getClass().name)
这可以复制/粘贴到其他类,因为没有硬编码的名称。它在静态范围内不起作用,所以我要添加
static Logger LOG = Logger.getLogger(this.name)
它还通过使用Groovy对静态范围中的“this”的支持来引用类,从而避免了硬编码
static Logger LOG = Logger.getLogger(this.name)