这看起来很奇怪,但是当grails构建war文件时,它不会生成log4j.properties或log4j.xml文件。
相反,它在WEB-INF / web.xml中有以下内容
web.xml中:
<listener>
<listener-class>org.codehaus.groovy.grails.web.util.Log4jConfigListener</listener-class>
</listener>
显然是“grails Log4j DSL配置登录内存”。这里的问题是 - log4j不会自动向JMX公开,以便我们动态更改,并且没有grails生成的log4j文件。但Config.groovy是一个编译文件。
必须有一个简单的方法来管理这个而不重建战争?
建议的一个选项是进入spring并在那里配置日志记录:
resources.groovy:
beans = {
log4jConfigurer(org.springframework.beans.factory.config.MethodInvokingFactoryBean)
{
targetClass = "org.springframework.util.Log4jConfigurer"
targetMethod = "initLogging"
arguments = ["classpath:myapp/log4j.properties"]
}
}
然后将DSL中的配置转移到配置的文件中。
任何人都可以建议'groovy'方式动态更改日志记录配置,而不必每次都重建WAR文件。使用grails-1.3.7。削减DSL似乎不是正确的方法。
由于
答案 0 :(得分:3)
您可能有一个外部配置文件,在启动时由您的应用程序搜索。
您的生产环境中的某个位置会有MyExternalConfig.groovy文件。例如:
log4j = {
def catalinaBase = System.properties.getProperty('catalina.base')
if (!catalinaBase) catalinaBase = '.'
def logDirectory = "${catalinaBase}/logs"
appenders {
rollingFile name:"infoLog", maxFileSize:'900KB', file:"${logDirectory}/${appName}Info.log", maxBackupIndex:10, layout:pattern(conversionPattern: '%d{DATE} %p %c - %m%n'), threshold: org.apache.log4j.Level.INFO
rollingFile name:"erroLog", maxFileSize:'900KB', file:"${logDirectory}/${appName}Erro.log", maxBackupIndex:10, layout:pattern(conversionPattern: '%d{DATE} %p %c - %m%n'), threshold: org.apache.log4j.Level.ERROR
}
root {
info 'infoLog', 'erroLog'
additivity = false
}
error erroLog:"StackTrace"
error erroLog: 'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages', // GSP
'net.sf.ehcache.hibernate'
warn infoLog: 'org.mortbay.log'
info infoLog: "grails.app"
}
然后在你的Config.groovy文件中,它属于conf文件夹中的grails项目,你把它作为文件的最后一件事:
def ENV_NAME = "MY_EXTERNAL_CONFIG"
if(!grails.config.locations || !(grails.config.locations instanceof List)) {
grails.config.locations = []
}
if(System.getenv(ENV_NAME)) {
grails.config.locations << "file:" + System.getenv(ENV_NAME)
} else if(System.getProperty(ENV_NAME)) {
grails.config.locations << "file:" + System.getProperty(ENV_NAME)
} else {
println "No external configuration file defined."
}
这将查找要添加到Config.groovy的grails.config.locations属性的外部配置文件。首先它将它作为一个系统环境变量查找(我用这种方式),如果找不到,那么它会查找一个命令行参数(所以你可以在启动tomcat应用程序时添加它,作为启动参数.SH)。
要配置系统环境varbble,只需在启动tomcat之前执行此操作:
MY_EXTERNAL_CONFIG="/home/tomcat/configs/MyExternalConfig.groovy"
export MY_EXTERNAL_CONFIG
--- start tomcat here ---
就是这样。