3

grails アプリケーションを起動すると、次のエラーが表示されます。

java.io.FileNotFoundException: stacktrace.log (許可が拒否されました)

これは、いくつかのファイル/ディレクトリをchownするか、ログが保存されるファイルを変更することで解決できることを知っていますが、これは望ましくありません.stdoutにstracktracesを記録したいだけです.

ドキュメントには次のように記載されています。

たとえば、完全なスタック トレースをコンソールに表示したい場合は、次のエントリを追加します。

エラー標準出力: "StackTrace"

ただし、次のようにも述べています。

これにより、Grails が stacktrace.log ファイルを作成しようとするのを止めることはできません。スタック トレースが書き込まれる場所をリダイレクトするだけです。

以降:

または、「stacktrace」アペンダーをまったく使用したくない場合は、「null」アペンダーとして構成します。

log4j = {
    appenders {
        'null' name: "stacktrace"
    }
}

2つを組み合わせて、次の構成を取得します。

// log4j configuration
environments {
    production {
        log4j = {
            appenders {
                console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
                // Don't use stacktrace.log
                'null' name: "stacktrace"
            }
        }

    }
}

log4j = {
    // print the stacktrace to stdout
    error stdout:"StackTrace"
}

残念ながら、これはうまくいきません:

情報: Web アプリケーション アーカイブ MyBackend.war をデプロイしています

2012 年 9 月 12 日午後 4:46:11 org.apache.catalina.core.StandardContext 開始

SEVERE: listenerStart エラー

2012 年 9 月 12 日午後 4:46:11 org.apache.catalina.core.StandardContext 開始

SEVERE: 以前のエラーが原因で、コンテキスト [/MyBackend2] の起動に失敗しました

確かに、stacktrace.log を書き込もうとしないため、アクセス許可が拒否されましたというエラーはスローされなくなりましたが、アプリがログに記録するのは「Error listenerStart」だけであるため、アプリが起動しない理由はわかりません。

スタックトレースを標準出力に記録するようにアプリを構成するのを手伝ってくれる人はいますか?

4

2 に答える 2

13

Grails バグ レポート: http://jira.grails.org/browse/GRAILS-2730 (いくつかの回避策を含む)

スタックトレースを stdout に出力したい場合:

log4j = {
  appenders {
    console name:'stacktrace'
    ...
  }
...
}

stacktrace.log を無効にします。

log4j = {
  appenders {
    'null' name:'stacktrace'
    ...
  }
...
}

Tomcat ログ ディレクトリ内のアプリケーション固有のログ ファイルへのスタック トレース

log4j = {
  appenders {
    rollingFile name:'stacktrace', maxFileSize:"5MB", maxBackupIndex: 10, file:"${System.getProperty('catalina.home')}/logs/${appName}_stacktrace.log", 'append':true, threshold:org.apache.log4j.Level.ALL
    ...
  }
...
}

このブログ投稿への称賛: http://haxx.sinequanon.net/2008/09/grails-stacktracelog/

于 2012-09-12T17:43:17.040 に答える
2

これが私がこれに対処しなければならないことです:

log4j = {
    appenders {
        // Be smart if we are running in tomcat or not 
        String logDir = Environment.warDeployed ? 
                System.getProperty('catalina.home') + '/logs' : 
                'target'

        // Handle the stacktrace log correctly
        rollingFile name:'stacktrace',
                maxFileSize: "5MB",
                maxBackupIndex: 10,
                file: "${logDir}/${appName}_stacktrace.log",
                layout: pattern(conversionPattern: "'%d [%t] %-5p %c{2} %x - %m%n'"),
                'append': true,
                threshold: org.apache.log4j.Level.ALL
    }
}

これにより、Tomcatおよび開発におけるWARとしてのデプロイを適切に処理できます。また、すべてのスタックトレースログをまとめることなく、複数のgrailsアプリケーションを同じコンテナ内で実行できるという利点もあります。

このためのインスピレーションは、上記の@FlareCoderの回答と、@BurtBeckwithのメーリングリストの投稿から得られます。

于 2013-01-24T18:27:27.343 に答える