web-dev-qa-db-ja.com

nginxログファイルから過去24時間のエラーを収集する

Nginxログファイルから過去24時間のログを収集するスクリプトを作成しようとしています。私のスクリプトはログファイルからすべてのログを収集しており、最後の24時間のエラーのみが必要です。

過去24時間を収集するスクリプトnginx access.logおよびerror.log

awk -vDate=`date -d'now-24 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' /var/log/nginx/access.log > /data/production_logs/nginxaccess.log
awk -vDate=`date -d'now-24 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' /var/log/nginx/error.log > /data/production_logs/nginxerror.log

2番目のスクリプト:

egrep 'Error|error|Exception|failed|Unhandled|err|Err' /data/production_logs/myapp.log > /data/production_logs/myapp_error.log

以下のようなスクリプト例:

egrep 'Error|error|Exception|failed|Unhandled|err|Err' /var/log/nginx/error.log > /var/log/nginx/last24hourlogs.log

過去24時間のログのみから上記のエラー例外をgrepし、last24hourlogs.logとして保存するには

必要なログ形式:

2016/11/27 13:55:00 [error] 6822#0: *14569 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 223.182.171.4, server: myappserver
2016/12/03 12:51:26 [error] 6820#0: *19094 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 157.48.95.8, server:

tail -f /home/example.com/.forever/bdapp.log

2016/12/19 12:30:51 [error] 2147#0: *5647 open() "/usr/share/nginx/html/example.com/myapp_email-templates/social-01.png" failed (2: No such file or directory), client: 66.249.84.191, server: example.com, request: "GET /myapp_email-templates/social-01.png HTTP/1.1", Host: "example.com"
2016/12/19 12:30:51 [error] 2147#0: *5646 open() "/usr/share/nginx/html/example.com/myapp_email-templates/social-02.png" failed (2: No such file or directory), client: 66.249.84.128, server: example.com, request: "GET /myapp_email-templates/social-02.png HTTP/1.1", Host: "example.com"
1
Ramesh Chand

特定の行を探してx(最後の)時間にわたってログファイルを読み取る

重要な注意事項

  • 以下の回答は、出力例がログファイルでの行の正確なコピーであると仮定して、提供されたサンプルOPに基づいて書かれました。これは、日付を正しく解析するために不可欠です。タイムスタンプのpositionまたはformatが異なる場合、失敗します!
  • ソート情報が欠落しているため、スクリプトをパフォーマンス用に最適化できませんでした。現在持っている情報を使用して、すべての行をチェックする必要があります。
  • また、ログファイルがUTCまたは現地時間でレポートするかどうかも不明です。andレポートを作成する時間。 「最後の24時間」は、ローカル時間の差によって修正する必要がある可能性があります。

スクリプト

#!/usr/bin/env python3
import time
import calendar
import sys

#--- set conditions below 
matches = ['Error', 'error', 'Exception', 'failed', 'Unhandled', 'err', 'Err']
# ---

pattern = "%Y/%m/%d%H:%M:%S"

source = sys.argv[1]
report = sys.argv[2]
last_hrs = sys.argv[3]

# shift =  time.timezone
shift = 0
now = time.time()

def convert_toepoch(pattern, stamp):
    """
    function to convert readable format (any) into epocherror
    """
    return int(time.mktime(time.strptime(stamp, pattern)))

with open(source) as infile:
    with open(report, "wt") as outfile:
        for l in infile:
            try:
                # parse out the time stamp, convert to Epoch
                stamp = "".join(l.split()[:2])
                tstamp = convert_toepoch(pattern, stamp)
                # set the conditions the line has to meet
                if now - tstamp - shift <= int(last_hrs)*3600:
                    if any([s in l for s in matches]):
                        outfile.write(l)
            except (IndexError, ValueError):
                pass

使い方

  1. スクリプトを空のファイルにコピーし、get_log.pyとして保存します
  2. ソースファイル、出力ファイル、および時間を引数として実行します。

    python3 /path/to/get_log.py <logfile> <ouput_file> 24
    

前述のとおり、時間(24)はローカルタイムゾーンで修正する必要があります。私にお知らせください。

何をする

  • スクリプトは、タイムスタンプ付きの行を探し、定義された期間(現在からx時間前)内の時間を表示し、エポックからの時間を比較します。一致する場合、条件付き文字列のいずれかがファイル内にあるかどうかを調べます。
  • その場合、行はレポートに書き込まれます

編集

OPは動作しなかったと述べました。ただし、OPがリクエストに応じて投稿された両方のサンプルのテストでは、スクリプトが完璧に機能することが示されています。

なぜ機能するのですか?

  • Opの例-タイムスタンプ:

    2016/11/27 13:55:00
    

    次の形式に変換されます。

    "%Y/%m/%d%H:%M:%S"
    

    行によって:

    stamp = "".join(l.split()[:2])
    

    その後、エポックに変換されます:

    tstamp = convert_toepoch(pattern, stamp)
    
  • この線:

    if now - tstamp - shift <= int(last_hrs)*3600:
    

    今からlast_hrs内にスタンプされた行を選択します。

  • この線:

    if any([s in l for s in matches]):
    

    続いて、文字列のいずれかを確認します。

    ['Error', 'error', 'Exception', 'failed', 'Unhandled', 'err', 'Err']
    

    行で発生します。

前述のように、私はexact OPを提供して徹底的にテストし、スクリプトがその仕事をするということ以外の結論に達することはできません。

2
Jacob Vlijm