grails在不重建war的情况下配置log4j?

grails在不重建war的情况下配置log4j?,grails,log4j,war,Grails,Log4j,War,这似乎很奇怪,但当grails构建war文件时,它不会生成log4j.properties或log4j.xml文件 相反,它在WEB-INF/WEB.xml中有以下内容 web.xml: org.codehaus.groovy.grails.web.util.Log4jConfigListener 显然,“grailslog4jdsl在内存中配置日志记录”。这里的问题是-log4j不会自动公开给JMX以便我们进行动态更改,并且grails不会生成log4j文件。但是Config.groovy

这似乎很奇怪,但当grails构建war文件时,它不会生成log4j.properties或log4j.xml文件

相反,它在WEB-INF/WEB.xml中有以下内容

web.xml:

org.codehaus.groovy.grails.web.util.Log4jConfigListener

显然,“grailslog4jdsl在内存中配置日志记录”。这里的问题是-log4j不会自动公开给JMX以便我们进行动态更改,并且grails不会生成log4j文件。但是Config.groovy是一个编译文件

必须有一个简单的方法来处理这件事,而不必重建战争

建议的一个选项是转到spring并在那里配置日志记录:

resources.groovy:

bean={
log4jconfig(org.springframework.beans.factory.config.MethodInvokingFactoryBean) { targetClass=“org.springframework.util.log4jconfig” targetMethod=“initLogging” 参数=[“类路径:myapp/log4j.properties”] } }

然后将DSL中的配置转移到已配置的文件

任何人都可以建议使用“groovy”方法动态更改日志记录配置,而无需每次重建WAR文件。使用grails-1.3.7。切断DSL似乎不是正确的方法


谢谢

您可能有一个外部配置文件,在启动时由您的应用程序搜索

在生产环境中的某个地方会有一个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"
}
然后,在conf文件夹中属于grails项目的Config.groovy文件中,将其作为文件的最后一项:

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."
}

就是这样。

如果修改了
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"
}
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."
}
MY_EXTERNAL_CONFIG="/home/tomcat/configs/MyExternalConfig.groovy"
export MY_EXTERNAL_CONFIG
 --- start tomcat here ---