【问题标题】:Where to put log4j.xml in a Grails app?在 Grails 应用程序中将 log4j.xml 放在哪里?
【发布时间】:2014-07-03 19:41:41
【问题描述】:

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

log4j = {
    appenders {
        ...
    }

    root {
        ...
    }

    ...etc.     
}

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

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

【问题讨论】:

    标签: grails configuration log4j


    【解决方案1】:

    Grails 默认不使用 log4j.xml。你有几个选择。

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

    2. 为 Grails 使用 Log4j XML plugin

    对于简单的用例,首选第二个选项。

    更新

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

    【讨论】:

    • 谢谢@Joshua Moore (+1) - 是否可以完全跳过log4j.xml?在您刚刚提到的另一个问题中(从昨天开始),您有以下内容:arguments = "path/to/log4j.xml";这是我考虑使用实际的log4j.xml 文件的唯一原因。 相反,是否可以在插件的 doWithSpring 事件处理程序中使用 Groovy 语法配置 log4jConfigurer,就像我在这个问题中的上述一样?这将完全消除对 log4j.xml 文件的需求,并且仍然让我能够在插件中指定 log4j 配置
    • 查看答案的更新。由于您并不真的 / 需要 / 使用可能是更简单的方法的 log4j.xml。
    【解决方案2】:

    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 中添加一些逻辑以确保它被打包到你的战争:

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

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 2014-07-26
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2020-03-07
      相关资源
      最近更新 更多