【问题标题】:grails configure log4j without rebuilding war?grails配置log4j而不重建战争?
【发布时间】:2011-09-18 21:02:10
【问题描述】:

这看起来很奇怪,但是当 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 中的配置转移到配置的文件中。

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

谢谢

【问题讨论】:

    标签: grails log4j war


    【解决方案1】:

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

    您的生产环境中的某处会有一个 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 文件中,属于你的 grails 项目在 conf 文件夹中,你把它作为文件的最后一件事:

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

    要配置您的系统环境变量,只需在启动 tomcat 之前执行此操作:

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

    就是这样。

    【讨论】:

    • 如果修改了MyExternalConfig.groovy,此解决方案是否会更新正在运行的应用程序中的日志记录设置?试图避免重新启动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2017-09-24
    • 2010-12-18
    • 2013-12-01
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多