4

Google App Engine はjava.util.logging.Loggerすべてのロギングに (JUL) を使用します。したがって、何かをログに記録するには (その後、 を介して取得しますLogService)、JUL で通常行うようにログを記録するだけです。

private Logger logger = Logger.getLogger(this.class.getName());

// ...

public void doWhatever() {
    logger.info("This will be logged.");
}

しかし、GAE のさまざまなサービス API (Memcache、Mail、Datastore など) に関する GAE チュートリアル/ガイドを読むと、サービスの 1 つがダウンしている可能性に備えて常にコーディングする必要があることが繰り返し述べられています。GAE は、CapabilitiesServiceサービス メソッドを呼び出す前に、そのサービスが現在有効になっているかどうかを確認できる を提供します。

だから私は尋ねます:JULロギング操作が失敗する可能性はありますか:

logger.info("失敗してログに記録されないことはありますか?");

そうでない場合、なぜですか?もしそうなら、JUL が詰まった場合に「フェイルオーバー」するにはどうすればよいですか? 前もって感謝します。

4

3 に答える 3

2
logger.info("Can I ever fail and not get logged?");

もちろん失敗することもあります。

この無邪気に見える行の背後にある構成は、次の可能性があります。

  • コンソールにメッセージを書き込みます (コンソールの書き込みはまだ初期化されていないか、既にシャットダウンされている可能性があります)
  • メッセージをファイルに追加します (多くのファイル I/O 関連の理由で失敗する可能性があります)。
  • 電子メールを送信します (多くのソケット I/O 関連の理由で失敗する可能性があります)。
  • DB への書き込み (多くの DB 関連の理由で失敗する可能性があります)
于 2013-02-04T22:33:33.820 に答える
1

私はこれと同じ問題に遭遇しました。はい、ロギング サービスはエラーなしで失敗する可能性があります。(GAE がロギング サービス API を改善するまでは) 得られる最善の方法は、ジョブを cron で起動して、たとえば 1 分ごとに起動し、logger.info(...).

次にLoggingService#fetchLogs(...)、フィルター処理を実行して、AppLogLine最新のロガー呼び出しを含む のみを取得し、それを取得できることを確認します。できない場合はlogger.info(...)失敗し、アプリを好きなように反応させることができます。

私は常に、ケーパビリティ サービスに ping を送信し、各サービスのステータス チェックを要求する安全なサーブレットを GAE アプリに公開しています。サービスが無効になっている場合やメンテナンスのためにダウンしている場合は、外部モニター (この URL を 5 分ごとにチェックする) からテキスト メッセージが送信されます。この「ログ チェック」cron ジョブをその種のサービス チェックに結び付けることができます。

于 2013-02-11T19:17:19.070 に答える
1

1 つのオプションとして、常にクラッシュして何かを理解しようとしている場合は、非同期 HTTP 呼び出しを (ログ メカニズムとして) 別のサーバーに送信することです。


また、これは数週間のクラッシュ地獄で私に笑顔を与えたからです: https://groups.google.com/d/msg/google-appengine/js5CeRWLQZ0/KrW2CpJ4JuYJ

ほとんどのシステムでは、アップタイムは 100% から他のすべてのシステムのダウンタイムの合計を差し引いたものです。このルールの例外はロギングです。Logging がダウンタイムの記録に失敗すると、Uptime が増加します。その結果、Google は、他のすべてのシステムよりも先に停止し、すぐに起動するロギング システムの構築に懸命に取り組んできました。

于 2013-02-11T14:45:48.810 に答える