0

GAE/J で独自のロギング ハンドラを作成する必要があります。GAE/J と Android の間で共有できるように適応させようとしている Android コードがあります。私が書こうとしている GAE コードは、既存のコードのログ ステートメントが GAE で機能することを可能にします。

ドキュメントによると、system.out と system.err に出力するだけで動作しますが、うまくいきません。ログ ビューアーにログが表示され、無関係なテキストが多すぎます。

2013-03-08 19:37:11.355 [s~satethbreft22/1.365820955097965155].: [my_log_msg]

そこで、 GAE ログ APIを調べ始めました。これは最初は有望に見えました。AppLogLine を構築し、RequestLogs オブジェクトのログ レコードを設定できます。

ただし、現在のリクエストの RequestLogs インスタンスを取得する方法はありません。ドキュメントでは、ここで明示的にそう述べています。

注: 現在、App Engine はリクエスト ID を使用して関連するログを直接検索することをサポートしていません。

新しい requestID を発明してそれにログ行を追加することもできると思いますが、これは意図されたものではないように見え始めていますか?

この API を使用して独自のログ レコードを作成したり、ログ コンソールに独自のログを記録したりした人はいますか。

また、GAE の java.util.logging のソースはどこにありますか? これは公立ですか?できれば、それがどのように機能するかを確認したいと思います。

私がやろうとしていることが不可能な場合は、ログ出力を FusionTable に書き込むなど、他のオプションを検討する必要があります。

4

1 に答える 1

0

最終的に、ロギング コードを GAE の java.util.logging の上に重ねるだけになりました。ロギングの複雑さとオーバーヘッドが増加するため、これは最適ではないように感じますが、これは、GAE の 3 番目のロギング フレームワークが行う必要があることだと思います (標準出力に出力するときに追加される余分な処理が問題ない場合を除きます)。

これが私のコードの核心です:

public int println(int priority, String msg) {
    Throwable t = new Throwable();
    StackTraceElement[] stackTrace = t.getStackTrace();

    // Optional: translate from Android log levels to GAE log levels.
    final Level[] levels = { Level.FINEST, Level.FINER, Level.FINE, Level.CONFIG,Level.INFO, Level.WARNING, Level.SEVERE, Level.SEVERE };
    Level level = levels[priority];

    LogRecord lr = new LogRecord(level, msg);
    if (stackTrace.length > 2) { // should always be true
        lr.setSourceClassName(stackTrace[2].getClassName());
        lr.setSourceMethodName(stackTrace[2].getMethodName());
    }
    log.log(lr);
    return 0;
}

スタックの深さは 2 を使用していますが、その # はロギング コードの「深さ」に依存することに注意してください。

最終的には、現在の com.google.appengine.api.log.RequestLogs インスタンスの取得と、独自の AppLogLine インスタンスの挿入を Google がサポートしてくれることを願っています。(API は実際にはそれを行うために存在しますが、上記のように明示的にサポートしていません。)

于 2013-03-19T17:40:45.727 に答える