Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向Grails类添加记录器_Grails_Logging_Slf4j - Fatal编程技术网

向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

我使用以下方法从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.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)