将日志记录添加到外部可插入脚本

时间:2014-01-09 03:42:30

标签: grails log4j

Can't call one closure from another所述,我在Grails应用程序中使用可插入脚本。

不幸的是,我发现我无法在这些脚本中使用log4j。我被迫使用println。

我尝试使用

import org.apache.commons.logging.LogFactory
def Log log = LogFactory.getLog(getClass())

但我没有输出。当我打印出对getClass()的调用结果时,我得到类似

的内容
myscript$_run_closure5

所以我认为问题在于我的Grails Config.groovy文件中没有配置此类。

有没有办法让我以编程方式将这些可插入脚本添加到log4j配置中?请记住,我事先并不知道脚本的名称是什么,所以这必须在运行时发生。

1 个答案:

答案 0 :(得分:0)

请考虑以下代码:

import org.apache.log4j.Logger

// ...
Logger log = Logger.getLogger('MyPlugin')
new File( grailsApplication.config.externalFiles ).eachFile { file -> 
  Binding binding = new Binding()
  binding.variables.log = log
  GroovyShell shell = new GroovyShell(binding)
  shell.evaluate(file)
  strategies.put( binding.variables.key, binding.variables )
}

<强>解释

  • 将类名传递给getLogger不是必须的,它实际上可以是任何字符串。您只需要确保在主程序的log4j.properties中匹配此字符串。

  • 您通过绑定变量“log”将创建的日志传递给插件脚本。然后插件脚本可以简单地以log.info('test123')

  • 的形式访问它

我的个人建议是使用logback而不是log4j。这两个库都是由同一个人开发的,并且声明logback取代了log4j。