2009-06-28 5 views
10

私はサーバで作業していましたが、私はロギングを実装し始めています。しかし、私はロギングのためにdbを使用すべきか、単にプレーンテキストファイルを使うべきかはわかりません。サーバーログ - データベースまたはログファイルにありますか?

すべてのリクエスト(リクエストのタイプ、リクエストのIPアドレス、セッションのトラッキング)に関する基本情報を記録する予定です。いくつかのリクエストについては、拡張された情報(どのようなタイプのリクエストが行われたかの詳細)があり、エラーがあればそれらもログに記録します。

一方で、ログをdbに入れるということは、ログに記録されたデータに対してクエリを実行できることを意味します。一方、これがDBに不必要な負担をかけるかどうかはわかりません。もちろん、dbとログファイルの両方をロギングに使用することもできます。適切な伐採に関する人々の考えは何ですか?

(それは違いを行った場合、私は、MySQL DBでApacheサーバ上でmod_pythonを使用しています。だから私はどちらかloggingライブラリを使用しているだろうか、単にDB内のいくつかのログテーブルを作成する。)

+1

開発者の言うとおり、SQLiteで "fopen()"に置き換えて設計されています。 –

答えて

10

まず、SLF4J/Logbackのようなロギングライブラリを使用して、この決定を動的に行うことができます。次に、設定ファイルを微調整して、ログメッセージの一部またはすべてを複数の異なる宛先のそれぞれにルーティングすることができます。

アプリケーションデータベースにログインする前に、非常に注意してください。たくさんのものをログに記録していてボリュームが高くなる場合は、簡単にそれを圧倒することができます。また、アプリケーションが最大容量に近い状態で実行されている場合や、障害モードで実行されている場合は、ログメッセージにアクセスできない可能性があります。おそらく、アプリケーションデータベースに行くべき唯一のメッセージは、ハイレベルなアプリケーション指向のイベント(アプリケーションデータの一種)です。

「ファイルシステムにログオンする」(大規模な実稼働環境では、冗長ログ集約サーバーによって読み取られたマルチキャストアドレスへのログ記録が含まれます)はるかに優れています。

ログファイルは特殊な分析データベースに読み込むことができます。ここでは、Hadoopを使用してログデータのマップ/リダクション分析を実行できます。

+1

splunkのようなsyslogサーバにログすると、多くのログフォーマットがサポートされ、httpサーバだけでなくデータベースログも作成できます。 非同期ロギングを使用していることを確認してください(log4jと私は他の多くの人がその種のアペンダーを持っていると思います)。 – feniix

+1

SLF4J/LogbackはJavaベースのソリューションです。 Pythonは広範なロギングモジュールを内蔵しています。 –

+0

@John:Javaのログは3つの主な候補(java.util.logging、Log4J、Jakarta Commons Logging)の間でかなり断片化しています。 SLF4Jはこれらのすべてを一貫して統合しようとする試みです。 Pythonチームはこれを行うことを非常に賢明でした。 –

1

常にデータベースにデータを記録しています。

これにより、アプリケーションデータベースに影響を与えることなくクエリを実行できます。また、ロギングを無効にするか、ログの量を変更する必要があるとわかった場合は、単純化されます。

しかし、ほとんどの現代のロギングライブラリは、アプリケーションへのログインの埋め込みと、ファイル、データベースなどの構成による宛先の選択をサポートしています。

Loggerには、ロギングの管理方法がたくさんありますが、デフォルトのパッケージにはデータベースロガーがありませんが、そのようなイベントハンドラを作成するのは難しくありません。

2

mix.log + dbが最適です。 最終的に分析する必要のあるdb情報にログインします。たとえば、1日あたりの平均ユーザー数などです。 そして、file.logを使用していくつかのデバッグ情報を保存します。

1

解析可能なログファイル形式を選択すると、ファイルにログを記録し、ログファイルを処理して詳細をデータベースに挿入する外部プロセス(おそらくcronによって実行される)を持つことができます。これは、アプリケーションとデータベースの負荷が低いときに発生するように設定できます。

データベースが使用できなくなった場合にはどうしても心配します。アプリケーションの実行を妨げたり、パフォーマンスを低下させたりしますか?ファイルシステムへのロギングでは、その問題に対処する必要はありませんが、ディスクの空き領域やログのローテーションについては心配する必要があります。

1

収益が発生した場合のみDBに記録します。

たとえば、あるサイトでは、Webサイトに配置されたすべての広告をデータベースに記録しました。それは収入を生み出した。何か重要なことについてログファイルを解析する理由はありません。

他はすべてファイルシステムに行きます。

デバッグのためにファイルシステムにログインします。それは一般的に私的なものです。実装の詳細。共有することはできません。

Apacheはファイルシステムに不具合を記録します。これを複製しないでください。

アクセス制御ログはファイルシステムに送られます。これらを詳細に見ることはほとんどありません。

ユーザアクティビティをデータベースに集約する必要がある場合があります。これは、あなたのサイトを改善するために勉強したいマーケティングと使いやすさの情報です。ただし、詳しい活動情報は膨大すぎてデータベースに記録することはできません。それをファイルシステムに置き、マーケティング/製品改善/ユーザビリティ分析データベースにそれをダイジェストします。

0

データベースにログする標準のPythonロガーを調整することを検討している場合には、このレシピが頭のスタートを与えるかもしれません:Logging to a Jabber account

0

他のほとんどの回答と同様に、私は主にファイルシステムのロギングを使用します。 Pythonのロギングパッケージでは、hereという提案を適用することで、データベースハンドラを簡単に作成できます。また、カスタムのFilterインスタンスを作成してデータベースハンドラにアタッチすることもできます。これにより、実際にデータベースにログするイベントを実行時に正確に判断できます。他の回答に沿って、後で分析するためにいくつかのタイプのイベントをデータベースに記録するだけの価値があると言います。

メインアプリケーションの処理能力が高い場合は、別のデータベース(別のサーバー)にログオンすることをお勧めします。

0

ログの種類は、データの処理方法と実行方法によって異なります。 dbへのロギングは、このログdbに基づいてレポーティングシステムを構築する場合に便利です。そうでなければ、特定のフォーマットで物事を記録することができます。このフォーマットでは、分析のためにデータを利用したい場合に後で解析することができます。たとえば、ファイルログから必要な情報のみを解析し、必要に応じてCSVを生成することができます。既に提案されているように、db loggerを使用する予定の場合は、アプリケーションdbとは別にdb loggerを用意してください。

第2に、メインアプリケーションと独立したロガーを検討することができます。ロギングを行うスレッドを生成するか、特定のポート/ソケットでロガーを実行してログメッセージを渡すか、すべてのロギングメッセージをまとめて収集し、各サイクルの最後にログに書き出します。

0

我々は両方を行います。

運用情報/進捗状況などを記録します。ログファイルに保存します。標準的なログファイルです。

データベースには、操作のステータスがログに記録されます。例えば。処理された各アイテム、スループット/経過時間/などのクエリを実行できます。このデータは、他の問題の潜在的な可能性のある異常(システムが「静か」など)をトレンドして検出する場合に特に役立ちます。

0

実際には、後でDB /ファイルロギングを切り替えることができます。データベースのログ記録は、プレーンテキストファイルのログよりもはるかに遅く、ログのトラフィックが高いほど重要になる可能性があります。 同じ要件を満たしていたときに、ライブラリ(スタンドアロンまたはハンドラとして機能するライブラリ)を作成しました。それはデータベースおよび/またはファイルにログインし、重要なメッセージをアーカイブすることができます(そして、すべてがテキストファイルに入っている間、アーカイブはデータベースなどであるかもしれません)。 これは、ゼロから別のものをコーディングすることからあなたを救います... 参照:The rrlog library

0

多くの人がデータベースにイベントの一部を記録しているようです。私は同じことをやっているが、それは少し遅れる。メッセージキューを介してデータベースにログする人はいますか?もしそうなら、あなたはキューイングに何を使用していますか?私はJava/J2EEを使用しています。

関連する問題