部署 grails 应用程序时 stacktrace.log 的问题

Posted

技术标签:

【中文标题】部署 grails 应用程序时 stacktrace.log 的问题【英文标题】:problem with stacktrace.log while deploying grails app 【发布时间】:2011-09-02 04:34:52 【问题描述】:

我在部署 grails 应用时遇到问题。

我得到以下异常:

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: stacktrace.log (Permission denied)
    at java.io.FileOutputStream.openAppend(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:177)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:102)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at org.apache.log4j.spi.OptionHandler$activateOptions.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
    at org.codehaus.groovy.grails.plugins.logging.Log4jConfig.createFullstackTraceAppender(Log4jConfig.groovy:177)
    at org.codehaus.groovy.grails.plugins.logging.Log4jConfig.this$2$createFullstackTraceAppender(Log4jConfig.groovy)
    at org.codehaus.groovy.grails.plugins.logging.Log4jConfig$this$2$createFullstackTraceAppender.callCurrent(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:44)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
    at org.codehaus.groovy.grails.plugins.logging.Log4jConfig.configure(Log4jConfig.groovy:145)
    at org.codehaus.groovy.grails.web.util.Log4jConfigListener.contextInitialized(Log4jConfigListener.java:62)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
May 25, 2011 11:16:54 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext

我在配置中对记录器的设置如下所示:

log4j =  
    appenders 
        rollingFile name: "stacktrace", maxFileSize: 1024, file: "/var/www/logs/myapp-stacktrace.log"
     
 

我还尝试使用以下命令禁用记录器 log4j = 附加程序 “空”名称:“堆栈跟踪”

这个目录的权限是为tomcat用户设置的

-rwxr--r-- 1 tomcat6 root 0 May 24 18:38 myapp-stacktrace.log

没有成功...感谢任何反馈和帮助!

【问题讨论】:

【参考方案1】:

我在 Grails 1.3.7 中遇到了类似的问题,并发现这已解决(通过将堆栈跟踪日志推送到标准日志记录目录)

log4j = 
    appenders 
    rollingFile name: "stacktrace", maxFileSize: 1024, file: "/var/logs/piws-stacktrace.log"
    ....

【讨论】:

啊,我脸红了 ;-) 老实说 - 很高兴我能帮上忙! 我们最终写了:file: (System.getProperty('catalina.base') ?: 'target') + '/logs/itsfeature.log' - 适用于生产和开发的机器人。【参考方案2】:

在http://www.grails.org/Deployment/#Tomcat查看有关将 Grails 应用程序部署到 Tomcat 的官方文档。

引用相关部分...

“请注意,在默认设置下,Grails 将尝试将某些文件写入 tomcat 目录,通常是 stacktrace.log 和 h2 数据库。您的 Tomcat 目录可能安装有 root 的所有者/组,而 Tomcat 服务器以用户 tomcat6 运行。这将导致您的应用程序无法启动并出现写入权限错误。要么更改 Grails 生产设置,以便将这些文件写入其他位置具有正确权限的目录,要么更改 Tomcat 目录的所有者(例如Unix:/var/lib/tomcat6) 到 tomcat6(或您使用 TOMCAT6_USER 设置设置的任何 tomcat 用户)。"

您可以使用sudo chown tomcat6 /var/lib/tomcat6更改所有者(如果需要,替换运行tomcat的用户和正在写入日志的目录),这是大多数情况下最简单和最合适的解决方案。

【讨论】:

【参考方案3】:

检查磁盘空间(远射)并尝试 chmodding 到 777 只是为了验证它的权限问题。如果是,您要么没有以 tomcat 用户身份运行 tomcat,要么您的目录已关闭...

【讨论】:

以上是关于部署 grails 应用程序时 stacktrace.log 的问题的主要内容,如果未能解决你的问题,请参考以下文章

Grails 部署问题(WAR 和 Tomcat)

为什么在向Grails添加插件时会出现ClassNotFoundException?

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

Grails 包绕过证书

Grails 2.3.1 没有运行

禁用Stacktrace筛选