3

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

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

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

文档指出:

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

错误标准输出:“StackTrace”

但是:它还指出:

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

然后:

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

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 开始

严重:错误 listenerStart

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

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

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

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

4

2 回答 2

13

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/

于 2012-09-12T17:43:17.040 回答
2

Here is what I have to deal with this:

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

This lets us gracefully handle being deployed as a WAR in Tomcat, as well as in development. It also has the advantage of allowing multiple grails applications to run within the same container without mushing all of their stacktrace logs together.

Inspiration for this comes from @FlareCoder's answer above, as well as from @BurtBeckwith's mailing list post.

于 2013-01-24T18:27:27.343 回答