2012-08-08 66 views
4

當我在命令行上執行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構建代理上)。對我來說,這似乎是一個不受歡迎的行爲,它被正常的標準輸出日誌所隱藏。

回答

0

錯誤可能意味着/someDirectory不存在,log4j沒有創建它的必要權限。

從棧跟蹤看來,Grails確實初始化配置,可能是因爲大多數命令都需要它。

我的建議是在Grails的主配置文件中創建另一個環境,它或者根本不配置log4j,或者只配置控制檯appender。

或者,將文件appender移至生產配置或將其配置爲寫入開發配置中的相對路徑,並覆蓋生產中的此路徑。

[編輯]

def logDir = System.getProperty('appname.logDir', '/someDirectory/'); 
+1

由於更換

def logDir = '/someDirectory/' 

回答。但似乎我無法表達自己的清楚。我甚至不啓動Tomcat。我只是在建立一場戰爭。即使log4j試圖寫入該日誌文件,我不明白爲什麼 – 2012-08-10 08:04:14

+0

請閱讀我的整個答案。 – 2012-08-10 08:14:51

+1

對不起,再次感謝再次推我的頭:-) 但這正是我想知道的。如果這些命令需要它,爲什麼它是這樣。因爲當我知道時,我知道該怎麼做。 我會在後面深入您的替代建議。 – 2012-08-10 09:57:59