【问题标题】:Inject log object in Grails class outside of grails-app在 grails-app 之外的 Grails 类中注入日志对象
【发布时间】:2010-11-27 11:36:09
【问题描述】:

我的 grails 项目中的 src/groovy 中有一个类。

如何创建一个日志字段,为该类注入正确的记录器?

grails 中有公共日志记录还是只有 log4j?

【问题讨论】:

    标签: logging grails groovy dependency-injection


    【解决方案1】:

    Grails 1.X

    做同样事情的一个更 Groovy 的方法是:

    private static log = LogFactory.getLog(this)
    

    这利用了 this 在静态上下文中引用 Class 对象这一事实,因此可以将上面的行从一个类复制粘贴到另一个类而无需修改。

    Grails 2.X

    使用 Groovy 1.8 中引入的@Log4j 注解。这将添加一个log 属性

    import groovy.util.logging.Log4j
    @Log4j 
    class MyClass {
    
      def doIt() {
        log.info 'hello'
      }
    }
    

    使用注解的一个好处是记录器会自动转换如下调用:

    log.info 'hello'
    

    到:

    if (log.isInfoEnabled() {
      log.info 'hello'
    }
    

    【讨论】:

    • 不能工作:这个在初始化静态字段的时候不可用
    • 它确实有效,因为在 Groovy 中 this 在静态上下文中指的是 Class 对象。显然这是 Java 和 Groovy 之间的区别。不信就试试看:)
    • 我会假设包是 org.slf4j.LoggerFactory,对吗?
    • 不,那是 log4J LogFactory
    • 为了完整性和正确性,我们需要添加'import'语句,'@Log4J'实际上是'@Log4j'。我可以确认它在 /src/groovy 中的 Grails 2.2.2 类中有效: import groovy.util.logging.Log4j @Log4j class MiscUtils {...log.info "m: ${m}"... }
    【解决方案2】:

    您可以像添加常规 Java 类一样添加它:

    Logger log = Logger.getLogger(getClass()) // log4j
    

    Log log = LogFactory.getLog(getClass()) // commons logging
    

    【讨论】:

    • 这就是我在 ATM 上解决它的方法,但仍然意味着即使整个应用程序的日志记录 bean 发生更改,我的类也与日志记录系统相关联。
    【解决方案3】:

    使用标准 Log4j 的新 Logger(getClass()) 有效,但为我记录了“java.lang.Class”(使用 Grails 1.2.1)。 Sublog 插件和@WithLog 解决了这个问题。见http://www.grails.org/plugin/sublog。这个插件也不会让 Trace 变成 Debug 和 Fatal Error...!

    【讨论】:

    • 嗨 Olivier,这个问题现在有点陈旧,因为它是针对 grails 1.0.4 的。
    • 不过,问题中没有提到这一点。我的答案仍然有效! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2010-09-23
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    相关资源
    最近更新 更多