在 grails-app 之外的 Grails 类中注入日志对象

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 的。 不过,问题中没有提到这一点。我的答案仍然有效! :-)

以上是关于在 grails-app 之外的 Grails 类中注入日志对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 中为 ShiroUser 指定包

Grails 在服务类中获取会话和管理

在 Grails 中使用 JPA 域类

Grails 3 Spring Security 覆盖登录表单

我应该将瞬态域类放在 grails 应用程序中的啥位置?

Grails 3 访问 node_modules