在 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 类中注入日志对象的主要内容,如果未能解决你的问题,请参考以下文章