奇怪的Log4J错误调用grails战争w/Grails 2.1
问题描述:
当我在命令行上执行grails -skipTests -verbose -plainOutput war
时,它尝试为生产环境配置日志记录。但是,我不想在构建战争时进行任何应用程序日志记录。有人知道为什么Grails试图做到这一点,以及如何避免它?谢谢。奇怪的Log4J错误调用grails战争w/Grails 2.1
它尝试登录到的目录在BuildAgent上不存在。但这是重点。没有应用程序在运行,我只是想建立一场战争。
我的日志配置:
// log4j configuration
log4j = {
appenders {
def logDir = '/someDirectory/'
if (Environment.getCurrentEnvironment() in [Environment.DEVELOPMENT, Environment.TEST]) {
logDir = 'log/'
}
def logFile = "${logDir}someLog.log"
def stacktraceLogFile = "${logDir}stacktrace.log"
appender new org.apache.log4j.DailyRollingFileAppender(name: "file",
layout: pattern(conversionPattern: "%d{[ dd.MM.yy HH:mm:ss.SSS]} [%t] %-5p %c %x - %m%n"),
file: logFile,
datePattern: "'.'yyyy-MM-dd")
appender new org.apache.log4j.DailyRollingFileAppender(name: "stacktrace",
layout: pattern(conversionPattern: "%d{[ dd.MM.yy HH:mm:ss.SSS]} [%t] %-5p %c %x - %m%n"),
file: stacktraceLogFile,
datePattern: "'.'yyyy-MM-dd")
}
error 'org.codehaus.groovy.grails.web.servlet', // controllers
'org.codehaus.groovy.grails.web.pages', // GSP
'org.codehaus.groovy.grails.web.sitemesh', // layouts
'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
'org.codehaus.groovy.grails.web.mapping', // URL mapping
'org.codehaus.groovy.grails.commons', // core/classloading
'org.codehaus.groovy.grails.plugins', // plugins
'org.springframework'
root {
warn 'stdout', 'file'
environments {
production {
error 'stdout', 'file'
}
}
}
}
我的堆栈跟踪:
java.io.FileNotFoundException: /someDirectory/stacktrace.log (No such file or directory)
at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:192)
at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
...
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSite.invoke(PogoMetaMethodSite.java:226)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:52)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:46)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
at gant.Gant.executeTargets(Gant.groovy:590)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeWithGantInstance(GrailsScriptRunner.java:748)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeScriptFile(GrailsScriptRunner.java:551)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeScriptWithCaching(GrailsScriptRunner.java:452)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.callPluginOrGrailsScript(GrailsScriptRunner.java:396)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.executeCommand(GrailsScriptRunner.java:371)
at org.codehaus.groovy.grails.cli.GrailsScriptRunner.main(GrailsScriptRunner.java:232)
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.codehaus.groovy.grails.cli.support.GrailsStarter.rootLoader(GrailsStarter.java:234)
at org.codehaus.groovy.grails.cli.support.GrailsStarter.main(GrailsStarter.java:262)
更新
我刚才注意到,只有在详细日志记录与Grails的启用此例外暴露(即在我的Jenkins构建代理上)。对我来说,这似乎是一个不受欢迎的行为,它被正常的标准输出日志所隐藏。
答
错误可能意味着/someDirectory
不存在,log4j没有创建它的必要权限。
从栈跟踪看来,Grails确实初始化配置,可能是因为大多数命令都需要它。
我的建议是在Grails的主配置文件中创建另一个环境,它或者根本不配置log4j,或者只配置控制台appender。
或者,将文件appender移至生产配置或将其配置为写入开发配置中的相对路径,并覆盖生产中的此路径。
[编辑]与
def logDir = System.getProperty('appname.logDir', '/someDirectory/');
由于更换
回答。但似乎我无法表达自己的清楚。我甚至不启动Tomcat。我只是在建立一场战争。即使log4j试图写入该日志文件,我不明白为什么 – 2012-08-10 08:04:14
请阅读我的整个答案。 – 2012-08-10 08:14:51
对不起,再次感谢再次推我的头:-) 但这正是我想知道的。如果这些命令需要它,为什么它是这样。因为当我知道时,我知道该怎么做。 我会在后面深入您的替代建议。 – 2012-08-10 09:57:59