2011-06-20 4 views
2

Cela semble assez étrange, mais quand Grails construit un fichier de guerre, il ne génère pas un fichier ou log4j.properties log4j.xml.Grails configurer log4j sans reconstruire la guerre?

Au contraire, il a les éléments suivants dans WEB-INF/web.xml

web.xml:

 
<listener> 
    <listener-class>org.codehaus.groovy.grails.web.util.Log4jConfigListener</listener-class> 
</listener> 

et apparemment "Grails Log4j DSL configure la connexion en mémoire". Le problème ici est - log4j est pas exposé automatiquement JMX pour nous de changer dynamiquement et il n'y a pas de fichier log4j généré par Grails. Mais Config.groovy est un fichier compilé.

Il doit y avoir un moyen facile de gérer cela sans reconstruire la guerre?

Une option proposée est de passer par au printemps et configurer l'enregistrement il y a:

resources.groovy:

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

Déplacez ensuite la configuration dans le DSL au fichier configuré.

Quelqu'un peut-il conseiller la façon dont « groovy » pour modifier dynamiquement la configuration de l'enregistrement sans reconstruire le fichier WAR à chaque fois. Utilisation de grails-1.3.7. Couper le DSL ne semble pas la bonne façon.

Merci

Répondre

3

Vous pouvez avoir un fichier de configuration externe qui est recherché par votre application au moment du démarrage.

Vous auriez un fichier MyExternalConfig.groovy quelque part dans votre environnement de production. Par exemple:

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

ensuite dans votre fichier Config.groovy, qui appartient à votre projet Grails dans le dossier conf, vous mettez ce que la dernière chose que du fichier:

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

Cela cherchera fichiers de configurations externes à ajouter à votre attribut grails.config.locations de votre fichier Config.groovy. D'abord, il le cherche comme une variable d'environnement système (je l'utilise de cette façon), s'il ne trouve pas, il cherche un paramètre de ligne de commande (donc vous pouvez l'ajouter quand vous démarrez votre app tomcat, comme paramètre de démarrage .sh).

Pour configurer votre environnement système variabble, il suffit de cela avant de commencer tomcat:

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

Voilà.

+0

Est-ce que cette solution mise à jour les paramètres de journalisation dans une application en cours d'exécution si 'MyExternalConfig.groovy' est modifié? Essayer d'éviter les redémarrages. –

Questions connexes