2014-01-09 73 views
0

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

我找到了適合我需求的可行解決方案。我只是將一個包添加到我的腳本文件(com.pluggable)中,並將com.pluggable添加到Config.groovy的log4j設置中的軟件包列表中。這對我來說已經夠好了,但是我會留下這個問題,以便根據我最初提出的問題提出更加動態的解決方案。 – greymatter

回答

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')

我個人的建議是,而不是使用Log4j的logback。這兩個庫都是由同一個人開發的,並且聲明logback取代了log4j。

相關問題