web-dev-qa-db-ja.com

ログをフォーマットするためのベストプラクティスは何ですか?

私はそれとの相互作用の広範なログを記録するハニーポットソフトウェアを書いています。平文でログインする予定です.logファイル。

サーバーのログ記録方法にあまり詳しくない人からの質問が2つあります。

  1. まず、ログファイルをどのように分割しますか。これを1か月実行した後、1つの大きな.logファイル、これを日、月、年ごとに行いますか?それに標準はありますか?

  2. 各行の形式は、*、-、+、何でも、1つの標準区切り文字がありますか?どこにも標準はありますか(私のグーグルはあまり育っていません)?

46
Andy Smith

ログファイルのこの形式が好きです。

$ python simple_logging_module.py
2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message
2005-03-19 15:10:26,620 - simple_example - INFO - info message
2005-03-19 15:10:26,695 - simple_example - WARNING - warn message
2005-03-19 15:10:26,697 - simple_example - ERROR - error message
2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message

これは、Pythonの ロギングモジュール からのものです。私は通常、1日に1ファイル、1か月に1つのフォルダー、1年に1つのフォルダーを持っています。それ以外の場合は適切に編集できない巨大なログファイルを取得します。

logs/
  2009/
    January/
     01012009.log
     02012009.log
     ...
    February/
     ...
  2008/
   ...

そのようなロギングの標準はありません。そして、ローリング、ファイルのレイアウト、それはすべて必要なものに依存します。一般的に、3つの主要なシナリオに直面しました。

  • すべて1つのファイルに。選択肢ではないようです。
  • 固定サイズのローリング。現在のファイルが定義された値より大きい場合、新しいログファイルが作成されるときにサイズを定義します。通常、ほとんどのlog4anythingパッケージ。
  • 合計カスタムローリング。このようなレイアウトを見ました
    • 毎日、YYYYMMDDの形式で名前が付けられた独自のディレクトリを取得します。ログをステージングしない場合は、他の回答に示されているYYYY\MM\YYYYMMDDのようなディレクトリレイアウトを検討してください。
    • このディレクトリ内で固定サイズのローリングを使用する必要があります。
    • すべてのファイルの名前はlogfile_yyyymmdd_ccc.logここで、cccは数字を増やしています。ファイル名に時間を追加することもお勧めです(たとえば、1分間に生成するログの数を簡単に判断するため)
    • スペースを節約するために、すべてのログはZipで自動的に圧縮されます。
    • 最後の3日間は常に非圧縮のままなので、UNIXテキストツールを使用してすばやくアクセスできます。

このカスタムはこのように見えました

 logs /
 20090101 /
 logfile_20090101_001.Zip 
 logfile_20090101_002.Zip 
 ... 
 20090102 /
 logfile_20090102_001.Zip 
 logfile_20090102_002.Zip 
 logfile_20090101_001.log 
 logfile_20090101_002.log 
 logfile_20090102_001.log 
 logfile_20090102_002.log 

優れたロギングのためのいくつかの優れたプラクティスもあります。

  • 常にログファイル名に日付を保持する
  • 常にログファイル名に名前を追加します。将来、ログファイルをシステムのさまざまなインスタンスから区別するのに役立ちます。
  • 常にすべてのログイベントのログ日時(できればミリ秒単位の解像度が望ましい)。
  • 常に日付をYYYYMMDDとして保存します。どこにでも。ログファイル内のファイル名。ソートに大いに役立ちます。一部の区切り文字が許可されています(例:2009-11-29)。
  • 一般に、データベースにログを保存することは避けてください。ロギングスキーマのもう1つの障害点です。
  • マルチスレッドシステムを使用している場合は、常にスレッドIDを記録します。
  • マルチプロセスシステムを使用している場合は、常にプロセスIDを記録します。
  • 多くのコンピューターがある場合は、常にコンピューターIDを記録します。
  • 後でログを処理できることを確認してください。 1つのログファイルをデータベースまたはExcelにインポートしてみてください。 30秒以上かかる場合は、ロギングが間違っていることを意味します。これも:
    • ロギングの適切な内部形式を選択します。 UnixテキストツールとExcelでうまく動作するため、スペースが制限されているのが好きです。
    • 日付/時刻に適した形式を選択して、SQLデータベースまたはExcelに簡単にインポートしてさらに処理できるようにします。
19
Michal Sznajder

ログファイルを分割するには、 logrotate のような外部アプリケーションを使用して、ダーティな作業を処理します。

各行の形式については、標準はないため、最適なものを使用する必要があります。後でログファイルを自動的に解析する場合は、ログ出力をフォーマットする際にそのことを覚えておくとよいでしょう。

2
Jeff

有名なロギングライブラリを使用することをお勧めします。ほとんどのロギングライブラリは、ロールオーバーをサポートしています。 Log4Net(.net)/ Log4J(Java)は、使用するのに特に優れたロギングライブラリであり、便利なオプションがたくさんあります。最適なロールオーバー間隔を使用してください。ハニーポットアプリケーションの場合、1時間ごとまたは1日ごとの売上が最もよく機能すると思います。また、256MBなどの固定制限を使用して、ログの努力が利用可能な空きディスク容量を超えないようにすることもできます。 Log4Net/Log4Jもこれをサポートしています。

Log4J @ Apache.Org
Log4Net @ Apache.Org

ログファイルの形式は、ニーズに応じて設定する必要があります。ログ入力に表示されそうにない区切り文字を使用することが非常に望ましいです。アプリケーションでは、これが不可能な場合があります。通常の状況では、一部の関係者はスペース(NCSAログ)を使用し、一部の関係者はコンマを使用して(CSVファイルを作成)、一部の関係者はタブを使用します(タブ区切りファイルを作成)。これらにはそれぞれ独自の利点と欠点があります。

2
meklarian

私の意見では、最も重要なのは:

  • ISO 8601のW3Cのプロファイル の後にフォーマットされた日付/時刻でレコード(行)を開始します
  • レコードのフィールド区切り記号としてタブを使用
1
Hibou57

提案:

ハニーポットシステム用です(そして悪役が実際にアプリケーション/サイトを強打しているのでない限り)代わりにデータベースへのログインに余分な時間をかけることを考慮してください

これにより、ログの分析と使用が簡単になり、リアルタイムになります(つまり、ログを分析/参照する前にETLプロセスを実行する必要はありません)。

これは、DBテーブルまたはファイルにあると言いましたが、これはフォーマットの定義の必要性を排除するものではありません。暫定的に、いくつかの一般的な属性(ID、IPアドレス、タイムスタンプ、Cookie/ID、「重要度/緊急度」のレベル)を持つ「polymorphic」形式を使用できます特定のイベントタイプを定義する短いニーモニックコード( "LIA" =ログイン試行、 "GURL" =推測URL、 "SQLI" SQLインジェクション試行など)に続いて、いくつかの数値フィールドといくつかの文字列フィールドが続きますどのセマンティクスはニーモニックによって異なります。要約する:

-Id 
-TimeStamp(日付と時刻に分割される場合があります)
-IP_Address 
-UserID_of_sorts 
-//その他の汎用/共通フィールド
-EventCode(LIA、GURL、SQLI ...)
-メッセージテキストメッセージ(特定のイベントインスタンスによって異なります)
-Int1 //数字... 
-Int2 
-Str1 // ...そして、EventCode 
によって意味が異なるテキスト-Str2 
-// ...?

さて...これがフラットファイルまたはSQLデータベース(特にDBに行く場合)に関係なく、標準のロギングライブラリを使用するが可能/すべきです。たぶんlog4j他の応答で示唆されているように(Pythonに簡単にバインドできるかどうかはわかりませんが、とにかく、Pythonの標準のロギングモジュールは+/-同じです...)または Pythonの標準ライブラリのロギングモジュール は、おそらくニーズに合わせて調整できます。

0
mjv