2011-06-20 105 views
2

这看起来很奇怪,但是当grails构建一个war文件时,它不会生成log4j.properties或log4j.xml文件。grails配置log4j没有重建战争?

相反,它具有以下的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是一个编译文件。

有没有一种简单的方法来管理这个没有重建战争?建议

一种选择是经过那里春天和配置日志记录:

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似乎并不正确。

谢谢

回答

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)。

要配置系统环境variabble,只是这样做的tomcat开始之前:

MY_EXTERNAL_CONFIG="/home/tomcat/configs/MyExternalConfig.groovy" 
export MY_EXTERNAL_CONFIG 
--- start tomcat here --- 

就是这样。

+0

如果修改了“MyExternalConfig.groovy”,此解决方案是否会更新正在运行的应用程序中的日志记录设置?试图避免重新启动。 –