2011-06-20 160 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」,此解決方案是否會更新正在運行的應用程序中的日誌記錄設置?試圖避免重新啓動。 –