如何在 grails 中禁用 log4j 插件?

Posted

技术标签:

【中文标题】如何在 grails 中禁用 log4j 插件?【英文标题】:How do disable log4j plugin in grails? 【发布时间】:2012-07-28 17:23:51 【问题描述】:

Grails 2.1 log4j 插件似乎在 grails 应用程序初始化期间重置了 log4j 配置(参见下面的堆栈跟踪)。

    at org.apache.log4j.LogManager.resetConfiguration(LogManager.java:233)
    at org.apache.log4j.LogManager$resetConfiguration.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
    at org.codehaus.groovy.grails.plugins.log4j.Log4jConfig.initialize(Log4jConfig.groovy:66)
    at org.codehaus.groovy.grails.plugins.log4j.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:48)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4389)
    at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:313)
    at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:145)

有什么办法可以禁用这个“功能”或完全删除这个插件?

我的 JBoss 服务器已经通过 jboss-log4j.xml 进行了配置,我不希望 grails 对配置进行任何更改。我已经尝试删除 Config.groovy 的 log4j 部分,但这样做没有效果。

正如 Kelly 所建议的,我已经从我的 war 文件中删除了所有与日志记录相关的 jar。 Log4j 类由 JBoss 提供。

编辑我也尝试了https://***.com/a/1190438/539048 中描述的技巧,但这似乎没有任何区别。

【问题讨论】:

【参考方案1】:

解决方案是从生成的 web.xml 文件中删除以下部分:

<listener>
    <listener-class>org.codehaus.groovy.grails.plugins.log4j.web.util.Log4jConfigListener</tag0:listener-class>
</listener>

为此,我根据this blog编辑了scripts/Events.groovy文件,但将监听器类名改为org.codehaus.groovy.grails.plugins.log4j.web.util.Log4jConfigListener

eventWebXmlEnd = String tmpfile ->

    def root = new XmlSlurper().parse(webXmlFile)

    def log4j = root.listener.findAll node ->
        node.'listener-class'.text() == 'org.codehaus.groovy.grails.plugins.log4j.web.util.Log4jConfigListener'
    
    log4j.replaceNode 

    webXmlFile.text = new StreamingMarkupBuilder().bind 
        mkp.declareNamespace("": "http://java.sun.com/xml/ns/j2ee")
        mkp.yield(root)
    

【讨论】:

如果这会将前缀 tag0 添加到您的 web.xml 中的所有标签名称并且您不想在其中使用它,请使用命名空间 java.sun.com/xml/ns/javaee 而不是 java.sun.com/xml/ns/j2ee。【参考方案2】:

像这样修改你的BuildConfig.groovy

inherits("global") 
    excludes 'log4j', 'jcl-over-slf4j', 'slf4j-api', 'slf4j-log4j12'

这应该会删除所有的日志库。

【讨论】:

我的 war 文件中没有日志记录 jar(我已经做了一些与你建议相当的事情)。我在问题中更明确地说明了这一点。还要从堆栈跟踪中注意到它是一个 grails 插件 (org.codehaus.groovy.grails.plugins.log4j.Log4jConfig)。 我在 [this][1] grails 应用程序上尝试了上述建议,因此我可以期望排除 grails 的 log4j 依赖项。但是,应用建议后,预期要删除的 jar 文件仍然存在于生成的 war 文件中。这些 jar 文件是:./lib/grails-plugin-log4j-2.4.4.jar 和 ./lib/log4j-1.2.17.jar [1]:github.com/WebDataConsulting/billing【参考方案3】:

我在this grails 应用程序上尝试了上述建议,这样我就可以期望排除 grails 的 log4j 依赖项。但是,在应用建议后,预期被删除的 jar 文件仍然存在于生成的 war 文件中。这些 jar 文件是:./lib/grails-plugin-log4j-2.4.4.jar 和 ./lib/log4j-1.2.17.jar

【讨论】:

以上是关于如何在 grails 中禁用 log4j 插件?的主要内容,如果未能解决你的问题,请参考以下文章

禁用 Grails 插件

Grails - 如何从 WAR 中删除 log4j

log4j与Grails 3.2.3:我没有得到任何记录

缺少 Grails 弹簧安全插件插件?

我们如何将更高版本的 Log4j 设置为 grails 应用程序

如何处理 grails spring-security-rest 插件中的自定义身份验证异常?