3

バックエンドで実行時間の長いプロセスがあり、ログにはリクエストごとに最後の 1000 回のロギング呼び出ししか保存されていません。

これはフロントエンド ハンドラーにとっては問題ではないかもしれませんが、プロセスが無期限に実行される可能性があるバックエンドにとっては非常に不便です。

ログをフラッシュして、新しいログ エントリが作成されるかどうかを確認しましたが、作成されませんでした。これは非常に間違っているように思われるので、これには簡単な解決策があるはずです。助けてください!

ありがとうございます!

更新: appengine の Google グループで既に誰かがこの件について質問しましたが、答えはありませんでした....

編集:私が懸念している「深さ」は、RequestLogs の総数ではありませんが、これは問題ありませんが、RequestLog 内の AppLogs の数 (1000 に制限されています) です。

編集2: David Popeの提案を試すために、次のテストを行いました:

def test_backends(self):
    launched = self.request.get('launched')
    if launched:
        #Do the job, we are running in the backend
        logging.info('There we go!')
        from google.appengine.api.logservice import logservice

        for i in range(1500):
            if i == 500:
                logservice.flush()
                logging.info('flushhhhh')
            logging.info('Call number %s'%i)
    else:
        #Launch the task in the backend
        from google.appengine.api import taskqueue
        tq_params = {'url': self.uri_for('backend.test_backends'),
                     'params': {'launched': True},
                     }
        if not DEBUG:
            tq_params['target'] = 'crawler'
        taskqueue.add(**tq_params)

基本的に、これは 1500 行を記録するバックエンド タスクを作成し、番号 500 でフラッシュします。2 つの RequestLog が表示されると予想されます。1 つ目は 500 行で、2 つ目は 1000 行です。

結果は次のとおりです。

  • ドキュメントが示唆する結果が得られませんでした。手動でログをフラッシュしても、新しいログ エントリは作成されません。1000 行の RequestLog が 1 つ残っています。しばらく前にドキュメントのこの部分を見ましたが、同じ結果が得られたので、ドキュメントが何を言っているのか理解していないと思いました。とにかく、当時、私はlogservice.flush()バックエンド コードに呼び出しを残しましたが、問題は解決されませんでした。
  • appcfg.py を使用してログをダウンロードしました私は通常、Web UI でログを参照します。この方法でログを表示するための快適なワークフローを取得できるかどうかはわかりません...私にとって理想的な解決策は、ドキュメントに記載されているものです。
  • 私のアプリの自動フラッシュ設定はデフォルトに設定されており、時々それらで遊んでいましたが、問題が解決しないことがわかったので、未設定のままにしました.

私はPythonを使用しています;)

4

2 に答える 2

1

Google docsは、フラッシングがまさにあなたが望むことを行うべきであることを示唆しています。フラッシュが正しく機能している場合は、「フラッシュ」というタグが付いた「部分的な」リクエスト ログと、元のリクエストの開始時刻が表示されます。

いくつかの点を確認してください。

  • ログをフラッシュするコードを投稿できますか? 機能していない可能性があります。
  • ログを表示するために GAE Web コンソールを使用していますか? 制限は単なる Web UI の制限である可能性があり、API を介して実際にログを取得すると、すべてのデータがそこにある可能性があります。(これは、フラッシュが正しく機能していない場合にのみ問題になります。)
  • アプリケーションのautoflush 設定を確認してください。

Java を使用している場合は、Java に対応するリンクがあると思います。あなたは言わなかった。

于 2013-02-03T06:00:49.407 に答える
0

私が考えることができるのは、次のような時限/ cronスクリプトを使用して、ワークステーション/サーバーから1時間ごとに実行することだけです

appcfg.py --oauth2 request_logs appname/ output.log --append

これにより、完全なログが得られるはずです-私は自分でテストしていません

さらに読んだところ、CRONはすでにappcfgの一部になっているようです https://developers.google.com/appengine/docs/python/tools/uploadinganapp#oauth

appcfg.py [options] cron_info <app-directory>
Displays information about the scheduled task (cron) configuration, including the
expected times of the next few executions. By default, displays the times of the
next 5  runs. You can modify the number of future run times displayed
with the -- num_runs=... option.

あなたのコメントに基づいて、私は試してみます。

1) 独自のロガー クラスを作成する

2) 複数のバージョンを使用する

于 2013-01-31T18:52:27.427 に答える