2014-01-23 86 views
1

我想在我的Config.groovy中注入log4j config存儲在屬性文件中的東西。在grails中注入log4屬性Config.groovy

這裏是我的屬性文件:

log.file=path/to/my/log 
log.root.level=info 
log.grails.app.level=info 

文件路徑EL語法$ {},但它並不適用於水平工作,因爲它是不是字符串沒問題。這裏是config.groovy:

appenders { 
    file name:'file', file:"${config.log.file}" 
} 

root { 
    ${log.root.level} 'stdout', 'file' 
} 

任何意見?

回答

1

您必須閱讀屬性文件並將其轉換爲Config.groovy中使用的ConfigObject。

log4j { 
    def props = new Properties() 
    new File("path/to/log.properties").withReader{ 
     props.load(it) 
    } 
    def slurp = new ConfigSlurper().parse(props) 

    appenders { 
     file name:'file', file:"$slurp.log.file" 
    } 

    root { 
     "$slurp.log.root.level" 'stdout', 'file' 
    } 
} 

請參考這個similar question

+0

謝謝,我現在可以載入我的屬性,但在服務器啓動時我有一個**的異常出現在配置log4j的日誌記錄:法無簽名:groovy.util.ConfigObject.level()是適用於參數類型: (java.lang.String,java.lang.String)values:[stdout,file] ** –

+0

我的不好。錯過了報價。更新了答案。 – dmahapatro

+0

它的工作原理,謝謝。我不明白究竟雙引號trilck,我很新的的Groovy/Grails的世界...... –

0

如果我讀的Grails Log4J DSL parser的代碼正確,你就應該能夠說

root { 
    "${config.config.log.root.level}" 'stdout', 'file' 
} 

或者如果不工作,然後

root { 
    delegate."${config.config.log.root.level}" 'stdout', 'file' 
} 

通常情況下,log4j內您可以訪問完整的grailsApplication.config(包括從外部配置文件合併的選項)作爲變量config,但看起來您需要第二個configroot {}區塊內。

解釋 - 在root關閉的關閉委託是一種RootLog4jConfig對象,它具有指向主Log4jConfig這對log4j關閉的其餘部分委託財產config,而這又都有自己的財產config指向解析的ConfigObject。我有點懷疑,這種行爲是故意的,它可能是值得一JIRA表明config應解析爲同樣的事情root塊作爲外這裏面。

+0

我已經嘗試了兩種解決方案。無輸出日誌和服務器啓動此消息**的log4j:log4j的配置錯誤時缺少物業:登錄** –

+0

@LaurentBOURGEOIS爲'config.'事情工作,你就必須列出外部屬性文件'grails.config .locations' –

+0

屬性文件已經在我的config.locations中'def envName = System.properties.getProperty(「tomcat.server.name」) grails.config.locations = [「classpath:」+ envName +「 - config.properties 「]' –