【问题标题】:adding loggers to Grails classes将记录器添加到 Grails 类
【发布时间】:2014-09-19 17:23:15
【问题描述】:

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

【问题讨论】:

    标签: grails logging slf4j


    【解决方案1】:

    我认为您所描述的内容没有任何问题。 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”的支持来引用类,这也避免了硬编码。

    【讨论】:

      【解决方案2】:

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

      @Log4j (for log4j)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多