Grails:将堆栈跟踪记录到标准输出

Posted

技术标签:

【中文标题】Grails:将堆栈跟踪记录到标准输出【英文标题】:Grails: log stacktrace to stdout 【发布时间】:2012-09-05 18:13:30 【问题描述】:

当我启动我的 grails 应用程序时,我收到以下错误:

java.io.FileNotFoundException: stacktrace.log(权限被拒绝)

我知道这可以通过 chowning 一些文件/目录或更改日志所在的文件来解决,但我不希望这样:我只想将 stracktraces 记录到标准输出。

documentation 声明:

例如,如果您希望将完整的堆栈跟踪信息转到控制台,请添加 此条目:

错误标准输出:“StackTrace”

但是:它还指出:

这不会阻止 Grails 尝试创建 stacktrace.log 文件 - 它只是重定向堆栈跟踪的写入位置。

后来:

或者,如果您根本不想使用“stacktrace”附加程序,请配置 它作为“空”附加器:

log4j = 
    appenders 
        'null' name: "stacktrace"
    

我结合2,得到如下配置:

// log4j configuration
environments 
    production 
        log4j = 
            appenders 
                console name:'stdout', layout:pattern(conversionPattern: '%c2 %m%n')
                // Don't use stacktrace.log
                'null' name: "stacktrace"
            
        

    


log4j = 
    // print the stacktrace to stdout
    error stdout:"StackTrace"

很遗憾,这不起作用:

信息:部署 Web 应用程序存档 MyBackend.war

2012 年 9 月 12 日下午 4:46:11 org.apache.catalina.core.StandardContext 开始

严重:错误 listenerStart

2012 年 9 月 12 日下午 4:46:11 org.apache.catalina.core.StandardContext 开始

严重:上下文 [/MyBackend2] 由于先前的错误而启动失败

诚然,它不再尝试写入 stacktrace.log,因此不再抛出 Permission denied 错误,但我不知道为什么应用程序无法启动,因为它记录的唯一内容是“Error listenerStart "

谁能帮我配置我的应用程序以将堆栈跟踪记录到标准输出?

【问题讨论】:

我发现更改 Config.groovy 中的 log4j 属性只有在应用程序启动后才有效。我最终通过输入“tail -n 150 /var/log/tomcat6/localhost.2012-09-18.log”来查看“Error listenerStart”的原因(如果您想查看今天的堆栈跟踪,请将日期更改为今天) 【参考方案1】:

Grails 错误报告: http://jira.grails.org/browse/GRAILS-2730 (包含一些解决方法)

如果您希望堆栈跟踪到标准输出:

log4j = 
  appenders 
    console name:'stacktrace'
    ...
  
...

禁用 stacktrace.log:

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

到 Tomcat 日志目录中应用程序特定日志文件的堆栈跟踪

log4j = 
  appenders 
    rollingFile name:'stacktrace', maxFileSize:"5MB", maxBackupIndex: 10, file:"$System.getProperty('catalina.home')/logs/$appName_stacktrace.log", 'append':true, threshold:org.apache.log4j.Level.ALL
    ...
  
...

感谢这篇博文:http://haxx.sinequanon.net/2008/09/grails-stacktracelog/

【讨论】:

关于“如果你想要堆栈跟踪到标准输出:”它还会尝试创建 stacktrace.log 吗?关于“禁用stacktrace.log:”这是否意味着我将无法再看到堆栈跟踪? (它不会打印到标准输出)关于“堆栈跟踪到 Tomcat 日志目录中的应用程序特定日志文件”感谢您为了完成而包含此内容:) 克里斯坦:是的,就是这个意思。控制台日志不会创建 stacktrace.log。 Tomcat 默认记录到 catalina.out。禁用它意味着它不会做任何事情,您将无法看到它。 你是对的:在你的第一个代码示例中,不会创建 stacktrace.log 并且在应用程序启动后抛出的 stacktraces 确实会显示在我的标准输出中(在我的情况下为 catalina.out )。不幸的是,它对“Error listenerStart”没有帮助。导致此错误的堆栈跟踪最终出现在 /var/log/tomcat/localhost 中。 今天 .log。我的错误是由于缺少生产环境的数据源所需的 jar 文件造成的。如果可以配置 grails 将该日志也发布到标准输出,那就太好了,但我想这是不可能的。【参考方案2】:

这是我必须处理的:

log4j = 
    appenders 
        // Be smart if we are running in tomcat or not 
        String logDir = Environment.warDeployed ? 
                System.getProperty('catalina.home') + '/logs' : 
                'target'

        // Handle the stacktrace log correctly
        rollingFile name:'stacktrace',
                maxFileSize: "5MB",
                maxBackupIndex: 10,
                file: "$logDir/$appName_stacktrace.log",
                layout: pattern(conversionPattern: "'%d [%t] %-5p %c2 %x - %m%n'"),
                'append': true,
                threshold: org.apache.log4j.Level.ALL
    

这让我们可以优雅地处理在 Tomcat 中以及在开发中部署为 WAR。它还具有允许多个 grails 应用程序在同一个容器中运行而无需将所有堆栈跟踪日志混合在一起的优点。

这方面的灵感来自@FlareCoder 的answer above,以及@BurtBeckwith 的mailing list post。

【讨论】:

以上是关于Grails:将堆栈跟踪记录到标准输出的主要内容,如果未能解决你的问题,请参考以下文章

记录器配置以记录到文件并打印到标准输出

如何将标准输出和标准错误重定向到 Python 中的记录器

如何将标准输出和标准错误重定向到 Python 中的记录器

aplay 管道使用文件而不是标准输入和标准输出来记录

Java关于e.printStackTrace()介绍

如何将堆栈跟踪(Carp 输出)转储到 Perl 中的文件?