将记录器添加到Grails类

时间:2014-09-19 17:23:16

标签: 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 it"
  }
}

记录器似乎在两种情况下都表现正常,但记录器的类别不同让我感到困惑。当我使用注释时,记录器的类是org.slf4j.impl.GrailsLog4jLoggerAdapter,但是当我使用自动添加到Grails工件的记录器时,该类为org.apache.commons.logging.impl.SLF4JLog

是否有建议(或更好)的方法将记录器添加到Grails类?

2 个答案:

答案 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)

您是否尝试过@ Log4j(对于log4j)。

@Log4j (for log4j)

How can i use 'log' inside a src/groovy/ class