log4属性注入Grails Config.groovy

时间:2014-01-23 14:28:24

标签: grails log4j

我想在Config.groovy中注入存储在属性文件中的log4j配置文件。

这是我的属性文件:

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

有任何建议吗?

2 个答案:

答案 0 :(得分:1)

您必须阅读属性文件并将其转换为ConfigObject才能在Config.groovy中使用。

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

答案 1 :(得分: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,但看起来您需要一秒钟当你进入config区块时,root {}就在前面。{/ 1>

解释 - root闭包的闭包委托是一个RootLog4jConfig对象,它有一个属性config,指向作为委托的主Log4jConfig对于log4j闭包的其余部分,它又有自己的属性config指向已解析的ConfigObject。我以某种方式怀疑这种行为是故意的,并且JIRA可能值得建议config应该解决root块内部与外部相同的事情。