4

私は現在、相互に通信している多くのアプリケーションを含む大規模なプロジェクトに取り組んでいます。

私と私のチームは、システム内のアプリケーションを管理および調整し、必要なバグ修正と変更要求を行います。システムは頻繁に使用されており、アプリケーションは大量のログを使用しています。

典型的な例:

メッセージクライアント

public void save(final Message message) {
   logger.info("Trying to save message: {}", message);

   boolean result = false;
   try {         
     result = messageService.save(message);
   } catch (final MessageStoreException e) {          
      logger.warn("Unable to save message {}", message, e);
      throw e;
   } catch (final Exception e) {
      logger.error("Unknown error when trying to save message!", e);
   }

   if (!result) {
      logger.warn("Could not save the message!");
   }
}

メッセージ サービス

public boolean save(final Message message) throws MessageStoreException {  
   if (message == null) {
      throw new IllegalArgumentException("message!");
   } 

   final boolean result = messageStore.store(message);
   if (result) {
      logger.info("Stored: {}", message.getId());
   } else {
      logger.warn("Unable to store: {}", message.getId());
   }

   return result; 
}

注:サンプル コードに最適なエラー処理がないことはわかっていますが、これは、私たちが管理している多くのアプリケーションでどのように見えるかです。

もちろん、これによりログファイルが非常に大きくなります。

ログファイルには注意が必要な予期しないエラーのみが含まれるように、運用環境でログレベルinfoとログレベルをオフにして、レベルのみをオンにしたいと考えています。warnerror

他の開発者は、バグやエラーを探してログファイルを表示しているときに「アプリケーション フロー」に従う方法がわからないため、この考えを好みません。

私はこれらの議論を理解しており、コミュニティからの意見が必要だと感じています。

では、ここでのベストプラクティスは何ですか? 実稼働環境で情報/警告ログ レベルを使用する必要がありますか、それともエラー ログのみを使用する必要がありますか? それとも両方?

ありがとう!

更新:アプリケーションは複数のサーバーで実行され、現在、すべてをファイルに記録しています (通常、アプリケーションごとにRollingFileAppenderを使用して 1 つのログ ファイル)。データベースへのロギングを開始するのは大変な作業なので、これはオプションではありません。

結論: ロギングは完全に簡単ではありません。情報レベルと警告レベルをオフにすることはしません (かなり思い切ったアクションでした) 代わりに、@jgauffin が言うように、「不要な」ログ メッセージを出力するアプリケーションのビジネス ルールを調べて分析します。

ケースクローズ!皆様、貴重なご意見とアドバイスをありがとうございました。

4

5 に答える 5

3

運用環境でログ レベル情報とログ レベル警告をオフにし、エラー レベルのみをオンのままにして、ログ ファイルに注意が必要な予期しないエラーのみが含まれるようにします。

他の開発者は、バグやエラーを探してログファイルを表示しているときに「アプリケーション フロー」に従う方法がわからないため、この考えを好みません。

これは典型的な問題です。ロギングを分析しましょう。

final boolean result = messageStore.store(message);
   if (result) {
      logger.info("Stored: {}", message.getId());
   } else {
      logger.warn("Unable to store: {}", message.getId());
   }

メッセージを保存できるドメイン ルールかどうかをチームが確信していないように見えるため、これは確かに問題です。メッセージを保存できないことは、実際には例外であるべきです (したがって、例外をスローする必要があります)。しかし、繰り返しになりますが、ドメイン/ビジネス ルールについては何も知りません。

しかし、そのようなロギングは通常、ビジネス ルールが不明確であることを示しています。したがって、より良い解決策はおそらく、ログが非常に重い理由をチームに分析させることです。アプリケーションは多くのメンテナンスを生成していますか? その場合は、ログ レベルを変更する代わりに、ロギングやその他のエラー チェック (メソッド引数の検証など) を削除することをお勧めします。

ログなしではフローをたどることができないというチームの発言は、同じことを示しています。バグがアプリケーションの早い段階ではなく深く導入されるように、引数がチェックされていません。

于 2012-10-27T17:27:11.890 に答える
2

さまざまなものをさまざまなログに記録することを検討しましたか。トランザクションを追跡できる 1 つのログ内のトランザクション データと、別のログへのエラー ロギング。これにより、メッセージのステータスを追跡し、問題が発生したかどうかを簡単に確認できるログを作成できます。

アクセスログとエラーログを持つ Web サーバーと比較してください。フローに従う他の手段がなければ、本番環境でこれらのメッセージを無効にすることはできないというあなたのチームに同意します。

于 2012-10-28T09:44:53.777 に答える
1

データベースにログインできます。(適切なロギング フレームワークを使用してセットアップするのはそれほど難しくありません。)

そこから、レベルと年齢に基づいてエントリを削除できます。更新:まず、すべてをログに記録します (必要に応じて DEBUG を含む)。たとえば、1 週間後に DEBUG メッセージを削除します。1 か月後に INFO メッセージを削除します。この時点で、ファイルに保存されているすべてのものがあります。

おまけ:バグが疑われる場合は、削除を一時停止します。

その後、おそらく、年に残りを削除します。

このようにして、必要なスペースと保持される情報の両方のニーズに対応できるはずです。これは、必要に応じて調整できます。

于 2012-10-26T21:58:57.860 に答える
1

私が作業したほとんどのインストールでは、本番環境で情報、警告、およびエラーのログが有効になっていました。システムの起動時に情報レベルのログが大量に記録され、その後はほとんど記録されないことが予想されます。通常の操作中にエラーや警告のログが記録されることはないと予想されます。ログが記録されている場合、それは調査が必要な問題があるためです。

ただし、これよりもかなり多くの情報ロギングを行っているようです。その一部をデバッグ ロギングに変更してから、それを無効にするか、別のログ ファイルにエラーと警告を書き込むことを検討できます。

ただし、ログ ファイルが大きいことに問題はありますか? ディスクが不足していませんか?それらの中で有用な情報を見つけるのに苦労していませんか? そうでない場合は、そのままにしておきます。問題が有用な情報を見つけることである場合は、ログ ファイルを小さくしようとするのではなく、大きなログ ファイルを処理する方法を見つけることに力を注ぎます。詳細なログの情報はあらゆる面で非常に有用であり、サイズが問題になる根本的な理由はありません。

私が現在働いている場所では、ログにもっと多くのことを記録する方向に進んでいます。現在、監視システムを通じて処理されているもの (処理されたメッセージの数、データベース クエリのタイミングなど) は、ログに移行しています。次に、すべてのログを中央のlogstashインスタンスに送信するだけで、ログを簡単に検索して分析できます。アプリでこれを処理するのではなく、ログ ストリームからメトリクスとアラートを生成することもできます。

于 2012-10-27T13:00:53.863 に答える
0

本番環境では、ロガー レベルTRACEERROR.

ログ ファイルで、不要なメッセージを特定できる場合はTRACE、それらのメッセージを削除します。

于 2017-07-31T06:27:02.197 に答える