为啥 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 中运行