我使用以下方法从Grails应用程序中的类访问记录器实例:
在Grails文物(控制器,服务,域类等)中,我只使用Grails添加的记录器,例如
class MyController {
def someAction() {
log.debug "something"
}
}
对于src/groovy
下的课程,我使用@groovy.util.logging.Slf4j
注释,例如
@Slf4j
class Foo {
Foo() {
log.debug "log it"
}
}
记录器似乎在两种情况下都表现正常,但记录器的类别不同让我感到困惑。当我使用注释时,记录器的类是org.slf4j.impl.GrailsLog4jLoggerAdapter
,但是当我使用自动添加到Grails工件的记录器时,该类为org.apache.commons.logging.impl.SLF4JLog
。
是否有建议(或更好)的方法将记录器添加到Grails类?
答案 0 :(得分:2)
我没有看到你所描述的任何问题。 SLF4J不是一个日志框架,它是一个日志框架包装器。但是除了Grails类中的一些特定于Grails的钩子之外,它们都实现相同的接口并最终委托给相同的loggers / appenders / etc.在真正的实现库中,通常是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支持"这个"的硬编码。在静态范围内引用该类。
答案 1 :(得分:0)