Grails:log stacktrace到标准输出

Grails:log stacktrace到标准输出,grails,grails-2.0,Grails,Grails 2.0,启动grails应用程序时,出现以下错误: java.io.FileNotFoundException:stacktrace.log(权限被拒绝) 我知道这可以通过浏览一些文件/目录或更改日志所指向的文件来解决,但我不想这样:我只想将stracktraces记录到stdout 各国: 例如,如果希望将完整堆栈跟踪转到控制台,请添加 此条目: 错误标准输出:“StackTrace” 然而,它还指出: 这不会阻止Grails尝试创建stacktrace.log 文件-它只是重定向堆栈跟踪写入的位置

启动grails应用程序时,出现以下错误:

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

我知道这可以通过浏览一些文件/目录或更改日志所指向的文件来解决,但我不想这样:我只想将stracktraces记录到stdout

各国:

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

错误标准输出:“StackTrace”

然而,它还指出:

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

后来:

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

我结合了2,得到了以下配置:

// log4j configuration
environments {
    production {
        log4j = {
            appenders {
                console name:'stdout', layout:pattern(conversionPattern: '%c{2} %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,因此不再抛出“权限拒绝”错误,但我不知道为什么应用程序无法启动,因为它只记录了“error listenerStart”

有人能帮我配置我的应用程序,将stacktraces记录到stdout吗?

Grails Bug报告: (包含一些变通方法)

如果要将stacktraces添加到标准输出:

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
    ...
  }
...
}

感谢这篇博文:

以下是我必须处理的问题:

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 %c{2} %x - %m%n'"),
                'append': true,
                threshold: org.apache.log4j.Level.ALL
    }
}
这让我们能够优雅地处理在Tomcat和开发中作为战争部署的问题。它还具有允许多个grails应用程序在同一容器中运行的优点,而无需将所有stacktrace日志混在一起


这方面的灵感来自@FlareCoder和@BurtBeckwith。

关于“如果你想将stacktraces添加到stdout:”它还会尝试创建stacktrace.log吗?关于“禁用stacktrace.log:”这是否意味着我将无法再看到stacktrace?(它不会打印到stdout)关于“在Tomcat日志目录中stacktraces到特定于应用程序的日志文件”感谢您为了完成而包括这个:)克里斯坦:是的,这就是它的意思。控制台日志记录不会创建stacktrace.log。默认情况下,Tomcat登录到catalina.out。禁用它意味着它不会做任何事情,你也看不到它。你是对的:对于第一个代码示例,不会创建stacktrace.log,并且在应用程序启动后抛出的stacktraces确实会显示在我的stdout中(在我的例子中是catalina.out)。不幸的是,它对“Error listenerStart”没有帮助。导致此错误的stacktrace位于/var/log/tomcat/localhost中。今天,日志。我的错误是由于缺少生产环境数据源所需的jar文件造成的。如果可以配置grails,那么这个日志也会发布到标准输出,那就太好了,但我想这是不可能的。我发现在Config.groovy中更改log4j属性只在应用程序启动后才起作用。我最终通过输入“tail-n150/var/log/tomcat6/localhost.2012-09-18.log”找到了“Error listenerStart”的原因(如果您想查看今天的stacktraces,请将日期更改为今天)
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 %c{2} %x - %m%n'"),
                'append': true,
                threshold: org.apache.log4j.Level.ALL
    }
}