如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配置中?请记住,我事先并不知道脚本的名称是什么,所以这必须在运行时发生。
答案 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。