Grails настроить log4j без восстановления войны? - PullRequest
2 голосов
/ 20 июня 2011

Это кажется довольно странным, но когда 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 автоматически для нас для динамического изменения, и нет файла log4j, сгенерированного grails.Но Config.groovy - это скомпилированный файл.

Должен ли быть простой способ справиться с этим, не перестраивая войну?

Один из предложенных вариантов - прыгнуть и настроить ведение журнала там:

resources.groovy: beans = {<br> log4jConfigurer(org.springframework.beans.factory.config.MethodInvokingFactoryBean) { targetClass = "org.springframework.util.Log4jConfigurer" targetMethod = "initLogging" arguments = ["classpath:myapp/log4j.properties"] } }

, затем сдвинуть конфигурацию в DSL в настроенный файл.

Может кто-нибудь посоветовать «Groovy» способ динамического изменения конфигурации журналирования без перекомпоновки файла WAR каждый раз.Использование Грааля-1.3.7.Вырезать DSL не кажется правильным.

Спасибо

1 Ответ

3 голосов
/ 21 июня 2011

У вас может быть внешний конфигурационный файл, который ищет ваше приложение во время запуска.

В вашей рабочей среде у вас будет файл 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."
}

Это будет искать внешние файлы конфигурации для добавления в ваш атрибут grails.config.locations вашего Config.groovy.Сначала он ищет ее как переменную System Environment (я использую ее таким образом), если она не находит, то ищет параметр командной строки (чтобы вы могли добавить его при запуске приложения tomcat, как параметр для запуска.sh).

Чтобы настроить переменную системной среды, просто сделайте это перед запуском tomcat:

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

Вот и все.

...