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