Grails:将堆栈跟踪记录到stdout

时间:2012-09-12 16:56:44

标签: grails grails-2.0

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

  

java.io.FileNotFoundException:stacktrace.log(Permission denied)

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

documentation州:

  

例如,如果您更喜欢完整堆栈跟踪转到控制台,请添加   这个条目:

     

错误标准输出:“StackTrace”

然而:它还说明:

  

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

后来:

  

或者,如果您根本不想使用'stacktrace'appender,请配置   它是一个'null'appender:

log4j = {
    appenders {
        'null' name: "stacktrace"
    }
}

我将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 start

     

SEVERE:错误listenerStart

     

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

     

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

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

任何人都可以帮我配置我的应用程序,只需将堆栈跟踪记录到stdout吗?

2 个答案:

答案 0 :(得分:13)

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

如果你想要堆栈跟踪到stdout:

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

禁用stacktrace.log:

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

stacktraces到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/

答案 1 :(得分: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 %c{2} %x - %m%n'"),
                'append': true,
                threshold: org.apache.log4j.Level.ALL
    }
}

这使我们可以优雅地处理在Tomcat和开发中作为WAR部署的问题。它还具有允许多个grails应用程序在同一容器中运行而不会将所有堆栈跟踪日志拼凑在一起的优势。

对此的启发来自@ FlareCoder的answer above,以及来自@ BurtBeckwith的mailing list post