使用grails.config.locations在Grails生产环境中配置Log4j

时间:2010-11-05 14:01:51

标签: grails log4j

我正在尝试将log4j配置维护在生产环境中的单独文件中。我有这个log4j.properties文件(生产中位于WEB-INF/classes):

log4j.rootLogger=error, stdout
log4j.rootLogger.additivity=false
log4j.logger.grails.app=info, stdout
log4j.additivity.grails.app=false
log4j.additivity.grails.app.service=false
log4j.logger.grails.app.controller=debug, stdout
log4j.additivity.grails.app.controller=false
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%7r] %6p - %14.14c - %m%n

我从Config.groovy完全删除了log4j配置。根据此评论中的第二个选项http://jira.codehaus.org/browse/GRAILS-2730?focusedCommentId=137021&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_137021,我以log4j.properties的方式添加了Config.groovy的位置:

  production {
    grails.serverURL = "http://xxxxx.ru/${appName}"
    grails.config.locations = [ "classpath:log4j.properties" ]
  }

但是在部署应用程序时,我仍然得到关于stacktrace.log文件的例外:

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:207)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
    at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
...

我不明白为什么......任何人?

感谢。

2 个答案:

答案 0 :(得分:3)

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

应该意味着运行Tomcat的用户在Log4J尝试创建 stacktrace.log 文件的文件夹中没有正确的写入权限。默认情况下,this is the folder在Tomcat启动时一直是工作目录。

您可以使用log4j.appender.stacktraces.File配置选项like so指定自定义 stacktrace.log 位置:

log4j.logger.stacktraces.com.foo=INFO,stacktraces
log4j.additivity.stacktraces=false
log4j.appender.stacktraces=org.apache.log4j.DailyRollingFileAppender
log4j.appender.stacktraces.File=${log.dir}/fooStacktraces.log
log4j.appender.stacktraces.DatePattern=${roll.pattern.daily}
log4j.appender.stacktraces.layout=org.apache.log4j.PatternLayout
log4j.appender.stacktraces.layout.ConversionPattern=%d{${datestamp}}%p%m%n

答案 1 :(得分:1)

默认情况下,属性文件(与未编译的任何其他资源一样)复制到 WEB-INF / classes 文件夹

要手动复制它们,请在项目中创建文件 scripts / Events.groovy 并添加以下代码(假设您的属性文件位于应用程序根目录中):

eventCompileEnd = {
    ant.copy(todir:classesDirPath) {
        fileset(file:"${basedir}/*.properties")
    }
}