4

grails -skipTests -verbose -plainOutput warコマンド ラインで実行すると、運用環境のログを構成しようとします。ただし、戦争の構築中にアプリのログを記録したくありません。Grailsがそれをやろうとする理由とそれを回避する方法を知っている人はいますか? ありがとう。

ログを記録しようとするディレクトリが 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 ビルド エージェント上) にのみ公開されることに気付きました。私には、通常の stdout ロギングによって隠されている望ましくない動作のように思えます。

4

1 に答える 1

0

エラーはおそらく/someDirectory存在せず、log4jにそれを作成するために必要な権限がないことを意味します。

スタックトレースから、おそらくほとんどのコマンドがそれを必要とするため、Grailsは構成を初期化するようです。

私の提案は、log4jをまったく構成しないか、コンソールアペンダーのみを構成する別の環境をGrailsのメイン構成ファイルに作成することです。

または、ファイルアペンダーを実稼働構成に移動するか、開発構成の相対パスに書き込むように構成し、実稼働でこのパスをオーバーライドします。

[編集]置換

def logDir = '/someDirectory/'

def logDir = System.getProperty( 'appname.logDir', '/someDirectory/' );
于 2012-08-08T15:13:34.520 に答える