将log4j.xml放在Grails应用程序中的位置?

时间:2014-05-15 11:26:30

标签: grails configuration log4j

有时我会在Grails应用的Config.groovy中看到类似的内容:

log4j = {
    appenders {
        ...
    }

    root {
        ...
    }

    ...etc.     
}

这显然是一种指定log4j配置的编程方式。我想知道:

  1. 是否可以在log4j.xml文件中指定log4j配置,然后告诉Grails应用程序在哪里查找它?
  2. 如果是这样,我应该将log4j.xml放在Grails应用程序中,以及如何/在何处将其“连接”到应用程序?

2 个答案:

答案 0 :(得分:2)

默认情况下,Grails不会使用log4j.xml。你有几个选择。

  1. 将Spring连接起来使用log4j.xml。如果您不熟悉Spring和所需的bean,这可能会有些复杂。您和我already discussed

  2. 使用Grails的Log4j XML plugin

  3. 对于简单的用例,第二种选择是首选。

    <强>更新

    根据您在评论中的后续问题,您可能最好使用DSL语法直接在插件中配置日志记录。在另一篇文章中提到explains how this is done

答案 1 :(得分:0)

Grails会自动排除grails-app/conf中与log4j.*匹配的任何文件:

来自scripts/_GrailsWar.groovy

    ant.copy(todir:"${stagingDir}/WEB-INF/classes", failonerror:false, preservelastmodified:true) {
        fileset(dir:"${basedir}/grails-app/conf") {
            exclude(name:"*.groovy")
            exclude(name:"log4j.*")
            exclude(name:"**/hibernate/**")
            exclude(name:"**/spring/**")
        }
        fileset(dir:"${basedir}/grails-app/conf/hibernate", includes:"**/**")
        fileset(dir:"${grailsSettings.sourceDir}/java") {
            include(name:"**/**")
            exclude(name:"**/*.java")
        }
        fileset(dir:"${grailsSettings.sourceDir}/groovy") {
            include(name:"**/**")
            exclude(name:"**/*.groovy")
        }
        fileset(dir:"${resourcesDirPath}", includes:"log4j.properties")
    }

正如所指出的,还有其他方法可以在不使用log4j.xml文件的情况下实现您想要的功能,但如果您确实想要使用它,则可以向grails-app/conf/BuildConfig.groovy添加一些逻辑以确保它被打包在你的WAR中:

grails.war.resources = { stagingDir, args ->
    copy(todir:"${stagingDir}/WEB-INF/classes", failonerror:false, preservelastmodified:true) {
        fileset(dir:"${basedir}/grails-app/conf") {
            include(name:"log4j.xml")
        }
    }
}