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"
#!/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
get_log.py
として保存しますソースファイル、出力ファイル、および時間を引数として実行します。
python3 /path/to/get_log.py <logfile> <ouput_file> 24
前述のとおり、時間(24
)はローカルタイムゾーンで修正する必要があります。私にお知らせください。
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を提供して徹底的にテストし、スクリプトがその仕事をするということ以外の結論に達することはできません。