为啥 Grails(在 Tomcat 中)同时记录到 catalina.out 和我的自定义文件附加程序?

Posted

技术标签:

【中文标题】为啥 Grails(在 Tomcat 中)同时记录到 catalina.out 和我的自定义文件附加程序?【英文标题】:Why is Grails (in Tomcat) logging to both catalina.out and my custom file appender?为什么 Grails(在 Tomcat 中)同时记录到 catalina.out 和我的自定义文件附加程序? 【发布时间】:2011-01-25 12:57:58 【问题描述】:

我在 Grails 1.2 中的 log4j DSL 配置有以下内容:

log4j = 
    appenders 
        console name: 'stdout', layout: pattern(conversionPattern: conversionPattern)

        environments 
            production 
                // ... some code to determine file path ...

                rollingFile name: 'file', file: "$logDirectory/$appName.log", layout: pattern(conversionPattern: conversionPattern)
                rollingFile name: 'StackTrace', file: "$logDirectory/$appName-stacktrace.log"
        
    

    environments 
        development  root  warn 'stdout'  
        test  root  warn 'stdout'  
        production  root  error 'file'  
    

    // ... package-specific logging configurations ...

当我作为战争部署到 Tomcat 时,我的日志会同时写入 catalina.out 和为生产定义的“文件”记录器。

我试过了:

additivity = false 添加到production root 定义中,这是行不通的(我真的没想到会这样做,因为它显然是在为根记录器本身设置可加性?)。 在 appenders 闭包内的 development test 块内定义“stdout”控制台附加程序,但这也不起作用。

也许这是我的 Tomcat 配置而不是我的 log4j DSL 的问题?我最接近找到有类似问题的人是this mailing-list thread,没有(简单的)解决方案。

如何防止日志在生产环境中写入 catalina.out?

【问题讨论】:

【参考方案1】:

我能够通过在Config.groovy 中执行以下操作来解决此问题:

import org.apache.log4j.Logger

log4j = 
    // ... configuration from question ...


environments 
    production 
        def logger = Logger.getRootLogger()
        logger.removeAppender('stdout')
    

但是,这感觉像是一种肮脏的 hack,我希望有更好的 Grails log4j DSL 专用方法来做到这一点。

此外,应用程序可能碰巧写入标准输出的任何内容都可能不会被写入,如果有日志/异常/堆栈跟踪以某种方式直接写入标准输出,这可能是一件坏事。

【讨论】:

【参考方案2】:

在 grails 2.4.5 中,您可以为标准输出定义一个“空”附加程序

https://grails.github.io/grails2-doc/2.4.x/guide/conf.html#logging

log4j = 
    ...
    appenders 
        'null' name: 'stdout'
    
    ...

【讨论】:

以上是关于为啥 Grails(在 Tomcat 中)同时记录到 catalina.out 和我的自定义文件附加程序?的主要内容,如果未能解决你的问题,请参考以下文章

为什么Grails(在Tomcat中)记录到catalina.out和我的自定义文件appender?

Tomcat“Log4J”上的 Grails WAR 根本不起作用

grails 2.0 - 在 Jetty 中运行,在 Tomcat 中运行

Tomcat中的Grails请求参数编码问题

如何在 Tomcat7 中部署 Grails 3.0.1 战争文件?

尝试在 Tomcat 中启动 grails App 时出现“严重:错误 listenerStart”