grails Config.groovy中的log4属性注入

grails Config.groovy中的log4属性注入,grails,log4j,Grails,Log4j,我想在我的config.groovy中注入存储在属性文件中的log4j config内容 log4j { def props = new Properties() new File("path/to/log.properties").withReader{ props.load(it) } def slurp = new ConfigSlurper().parse(props) appenders { file name:

我想在我的config.groovy中注入存储在属性文件中的log4j config内容

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'
    }
}
这是我的属性文件:

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

有什么建议吗?

您必须读取属性文件并将其转换为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'
    }
}

参考这个。

如果我正确地阅读了Grails的代码,你应该能够说

root {
    "${config.config.log.root.level}" 'stdout', 'file'
}
或者如果那不行的话

root {
    delegate."${config.config.log.root.level}" 'stdout', 'file'
}
通常,在
log4j
闭包中,您可以访问完整的
grailsApplication.config
(包括从外部配置文件中合并的选项)作为变量
config
,但当您在
根{}/code>块中时,似乎需要第二个
config


解释-根闭包的闭包委托是一个
RootLog4jConfig
对象,它有一个属性
config
,指向主
Log4jConfig
,主
Log4jConfig
是其余
log4j
闭包的委托,而它又有自己的属性
config
,指向解析的
ConfigObject
。不知何故,我怀疑这种行为是故意的,建议
config
root
块内部和外部解析为相同的内容可能值得一试。

谢谢,我现在可以加载我的属性,但当服务器启动时,配置log4j日志记录时出现异常:没有方法签名:groovy.util.ConfigObject.level()适用于参数类型:(java.lang.String,java.lang.String)值:[stdout,file]my bad。错过了引语。更新了答案。很有效,谢谢。我并不完全理解双引号trilck,我对Groovy/Grails世界还很陌生……我已经尝试了这两种解决方案。没有输出日志,服务器启动时出现此消息log4j:ERROR属性在配置log4j时丢失:log@LaurentBOURGEOIS要使
config.
工作正常,您必须在
grails.config.locations
properties文件中列出外部属性文件,该文件已在my config.locations
def envName=System.properties.getProperty(“tomcat.server.name”)grails.config.locations=[“classpath:“+envName+”-config.properties”]
@LaurentBOURGEOIS-hmm,检查它看起来像是
config.config.log.root.level
可能会起作用——与根闭包外部相比,根闭包内部需要额外的“config”。我怀疑这是故意的。。。