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

时间:2010-03-09 17:10:16

标签: tomcat grails log4j

我在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和我的'file'记录器,并为生产定义。

我试过了:

  • additivity = false添加到root {}的{​​{1}}定义中,这不起作用(我真的不希望这样,因为它显然为根记录器本身设置了可加性?)。
  • production {}闭包内的development {}test {}块内定义'stdout'控制台appender,但这也不起作用。

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

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

2 个答案:

答案 0 :(得分:3)

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

import org.apache.log4j.Logger

log4j = {
    // ... configuration from question ...
}

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

然而,这感觉就像一个肮脏的黑客,我希望有一个更好的,Grails log4j DSL特定的方式来做到这一点。

此外,应用程序可能会写入stdout的任何内容都可能无法编写,如果将某些日志/异常/堆栈跟踪以某种方式直接写入stdout,这可能是一件坏事。

答案 1 :(得分:1)

在grails 2.4.5中,您可以为stdout

定义一个'null'appender

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

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