web-dev-qa-db-ja.com

サーバーログファイルをデータベースに書き込むことは良い考えですか?

O'Reillyの主題に関する記事 を読んだ後、Stack Overflowに問題についての考えを尋ねたかった。

49
Thomas Owens

ローカルにディスクに書き込んでから、定期的に(たとえば、ログのロールオーバー時に)データベースにバッチ挿入します。別の優先度の低いプロセスでそれを行います。より効率的で堅牢な...

(ちなみに、データベースのログテーブルに、「ログイベントの発生元のマシン」の列が含まれていることを確認してください。非常に便利です。)

59
Jon Skeet

サーバーエラーのかなりの割合でデータベースとの通信に問題が発生することを考えると、私はノーだと思います。データベースが別のマシンにある場合は、ネットワーク接続がログに記録できないエラーの別の原因になります。

サーバーエラーをデータベースに記録する場合、データベースにアクセスできない場合に備えて、ローカル(イベントログまたはファイルなど)に書き込むバックアップロガーを用意することが重要です。

8
MusiGenesis

可能であればDBにログインし、DBの速度が低下しない場合:)

これは、DB内の何かをログファイル内で検索する方がはるかに高速です。特に、あなたが何が必要かを先に考えるなら。 dbにログインすると、次のようにログテーブルをクエリできます。

select * from logs
where log_name = 'wcf' and log_level = 'error'

エラーを見つけたら、このエラーにつながるパス全体を確認できます

select * from logs
where contextId = 'what you get from previous select' order by timestamp

この情報をテキストファイルに記録した場合、どのように取得しますか?

編集: JonSkeetが提案したように、dbへのロギングを非同期にすることを検討する必要があると述べた場合、この答えはより良いでしょう。だから私はそれを述べます:)私はそれを必要としませんでした。たとえば、その方法については、Richard Kiessigによる「Ultra Fast ASP.NET」を確認できます。

3
Piotr Perak

データベースが本番データベースである場合、これは恐ろしい考えです。あなたはwillバックアップ、レプリケーション、リカバリに問題があります。 DB自体、存在する場合はレプリカ、およびバックアップ用のより多くのストレージのように。レプリケーションのセットアップと復元により多くの時間、バックアップを検証するより多くの時間、バックアップからDBを回復するより多くの時間。

2
Igor

データベースにログが必要な場合は、おそらく悪い考えではありませんが、ログファイルのエントリが多い場合は、この記事のアドバイスに従わないようにしましょう。主な問題は、ファイルシステムに、データベースだけでなく、ビジーなサイトからのログに追いつくのに問題があることを見てきました。本当にこれを実行したい場合は、ログファイルが最初にディスクに書き込まれた後で、ログファイルをデータベースにロードすることを検討します。

1
carson

読み書きにRAMを使用する適切に設定されたデータベースについて考えてみますか?これはディスクへの書き込みよりもはるかに高速であり、ディスクを提示しませんIOボトルネック利用可能なすべてのIOハンドルを使用している現在実行中のスレッドで待機するようOSに指示するため、スレッドがロックダウンを開始するときに発生する多数のクライアントにサービスを提供する場合を参照してください。

このデータを証明するベンチマークはありませんが、私の最新のアプリケーションはデータベースロギングを使用してローリングしています。これらの応答の1つで言及されているように、これにはフェイルセーフがあります。データベース接続を作成できない場合は、ローカルデータベース(多分h2?)を作成して、それに書き込みます。次に、接続を再確立し、ローカルデータベースをダンプしてリモートデータベースにプッシュするデータベース接続の定期的なチェックを行うことができます。

これは、H-Aサイトがない場合、営業時間外に行うことができます。

将来的には、私のポイントを実証するためのベンチマークを開発したいと思っています。

幸運を!

1
Andrew Carr