7

さて、これがシナリオです。大量のレコードを処理し、それに応じてデータベースに情報を入力するユーティリティがあります。

マルチスレッド バッチでこれらのレコードを処理します。このような各バッチは、各レコードのワークフロー トレースを作成するために同じログ ファイルに書き込みます。潜在的に、1 日で 100 万近くのログ書き込みを行う可能性があります。

このログを別のサーバーに存在するデータベースに作成する必要がありますか? 考慮事項:

  1. 複数のスレッドが同じログ ファイルに書き込むことの明らかな欠点は、ログ メッセージが相互にシャッフルされることです。データベースでは、バッチ ID でグループ化できます。
  2. パフォーマンス - バッチ処理をさらに遅くするのはどれですか? ローカル ファイルへの書き込み、または同じネットワーク上の別のサーバー上のデータベースへのログ データの送信。理論的には、ログ ファイルの方が高速ですが、ここで落とし穴はありますか?

どちらのアプローチでも実行できる最適化はありますか?

ありがとう。

4

10 に答える 10

6

興味深い質問は、データベースにログを記録することを決定した場合、データベース接続エラーをどこに記録するかということです。

データベースにログを記録している場合、通信エラーが発生した場合に備えて、常にセカンダリ ログの場所 (ファイル、イベント ログなど) を保持しています。後で問題を診断するのが本当に簡単になります。

于 2008-08-27T07:20:58.583 に答える
3

頭に浮かぶことの 1 つは、各スレッドが独自のログ ファイルに書き込みを行い、それらを結合するために毎日バッチを実行できることです。

データベースにログを記録している場合、特に DB がネットワーク上にある場合は、おそらくチューニングと最適化を行う必要があります。少なくとも、DB 接続を再利用する必要があります。

さらに、ログにデータベースが必要な特定のニーズはありますか? 「grep」だけが必要な場合は、データベースにログインしてもあまりメリットがないと思います。

于 2008-08-27T07:12:56.327 に答える
2

または、キューにログインするのはどうですか?そうすれば、別のものにログオンしたいときはいつでもポーラーを切り替えることができます。これにより、ログファイルのロールオーバーやアーカイブなどが非常に簡単になります。また、次のように、さまざまなものにログを記録するポーラーを追加できるので便利です。

  • エラーメッセージを探してFogBugzアカウントに投稿するポーラー
  • 「ハッキングの試み」ファイルへのアクセス違反(「xが/foo/y/bar.htmlにアクセスしようとした」)を探すポーラー
于 2008-08-27T12:29:54.300 に答える
2

私はここで他の答えを二番目に、データで何をしているかによって異なります

ここには 2 つのシナリオがあります。

  1. 私たちが構築した製品の管理者ユーザーは、すべての機能を備えた素敵な小さなアプリでそれらを表示できる必要があるため、ログの大部分は DB に送信されます。

  2. すべての診断情報とデバッグ情報をファイルに記録します。それを実際に「きれいにする」必要はなく、TBH も頻繁に必要としないため、ほとんどの場合、ログに記録してアーカイブするだけです。

ユーザーがそれで何かをしている場合は、DBにログを記録します。それがあなたのためであれば、おそらくファイルで十分でしょう。

于 2008-08-27T07:10:02.527 に答える
2

役立つかどうかはわかりませんが、 Microsoft LogParserというユーティリティもあり、テキスト ベースのログ ファイルを解析して、データベースのように使用できます。ウェブサイトから:

ログ パーサーは、ログ ファイル、XML ファイル、CSV ファイルなどのテキスト ベースのデータや、イベント ログ、レジストリ、ファイル システム、および Active Directory®。必要な情報とその処理方法を Log Parser に伝えます。クエリの結果は、テキスト ベースの出力でカスタム形式にすることも、SQL、SYSLOG、グラフなどのより専門的なターゲットに永続化することもできます。ほとんどのソフトウェアは、限られた数の特定のタスクを実行するように設計されています。Log Parser は違います...使用できる方法の数は、ユーザーのニーズと想像力によってのみ制限されます。Log Parser を使用すると、世界がデータベースになります。

私はこのプログラムを自分で使用したことはありませんが、非常に興味深いようです。

于 2008-08-27T07:40:15.777 に答える
1

データベース - 複数のスレッドについて言及したため。同期とフィルタリングされた取得が、私の答えの理由です。
ファイルに切り替えることを決定する前に、パフォーマンスの問題があるかどうかを確認してください

于 2008-08-27T07:06:55.560 に答える
1

ファイル ログの制限を回避する方法はいくつかあります。

ある種のスレッド ID を使用して各ログ エントリをいつでも開始し、個々のスレッド ID を grep することができます。または、スレッドごとに異なるログ ファイル。

過去に、優先度の低い別のスレッドでデータベースにログインしました。何がうまくいかなかったのかを理解しようとするとき、クエリ可能性は非常に価値があると言わざるを得ません。

于 2008-08-27T07:07:26.277 に答える
1

SQLite データベースなどのデータベース ファイルにログを記録するのはどうでしょうか。マルチスレッドの書き込みを処理できると思いますが、それには独自のパフォーマンス オーバーヘッドもあるかもしれません。

于 2008-08-27T07:10:45.783 に答える
0

ガイウスの答えが好きです。すべてのログ ステートメントをスレッドセーフ キューに入れ、そこから処理します。DB の場合、たとえば 100 個のログ ステートメントを 1 つのバッチにまとめることができ、ファイルの場合は、それらがキューに入るときにそれらをファイルにストリーミングすることができます。

ファイルまたはデータベース? 他の多くの人が言うように; ログファイルが何のために必要かによって異なります。

于 2008-10-16T13:57:54.967 に答える
0

その後のログファイルの扱いに大きく依存すると思います。

2 つの操作のうち、ログ ファイルへの書き込みは高速になります。特に、別のサーバー上のデータベースへの書き込みを提案しているためです。

ただし、ログ ファイルを定期的に処理および検索しようとしている場合は、これを行うのに最適な場所はデータベースです。

log4net のようなロギング フレームワークを使用する場合、多くの場合、入力をファイルまたはデータベースにリダイレクトする単純な構成ファイル ベースの方法が提供されます。

于 2008-08-27T07:05:22.567 に答える