Pythonを触ってみる4

前回でファイルの読み込みできるようになりました。

次は特定の行のみを解析するようにします。

読み込むログファイル

(ログ出力時間 プロセスID ログレベル ログ内容)

19:02:49.615 4fcd1c9d-75fe-4396-a7a0-0af32eb066c2 INFO BatchApp start
19:02:50.568 4fcd1c9d-75fe-4396-a7a0-0af32eb066c2 INFO data insert start
19:03:49.569 0cc41e62-d704-4685-92e2-fb49922d42ca INFO BatchApp start
19:03:51.131 4fcd1c9d-75fe-4396-a7a0-0af32eb066c2 INFO data insert end
19:03:51.146 4fcd1c9d-75fe-4396-a7a0-0af32eb066c2 INFO BatchApp end
19:03:56.710 0cc41e62-d704-4685-92e2-fb49922d42ca INFO data insert start
19:04:16.319 0cc41e62-d704-4685-92e2-fb49922d42ca INFO data insert end
19:04:19.944 0cc41e62-d704-4685-92e2-fb49922d42ca INFO data insert start
19:04:19.944 0cc41e62-d704-4685-92e2-fb49922d42ca INFO data insert end
19:04:54.914 0cc41e62-d704-4685-92e2-fb49922d42ca INFO BatchApp end

特定の文字を含む行のみ出力

プロセスID後のバッチの実行時間を集計したいので
”BatchApp start”と”BatchApp end”を含む行が対象になります。

サンプルプログラム

f = open("c:/input/sample_log_01.txt", 'r', encoding='UTF-8')
while True:
   line = f.readline()
   if line:
       if line.find("BatchApp") != -1:
           print(line.replace("\n", ""))
   else:
       break
f.close()

find関数を使って"BatchApp"を含む行のみ出力するようにします。

実行結果

19:02:49.615 4fcd1c9d-75fe-4396-a7a0-0af32eb066c2 INFO BatchApp start
19:03:49.569 0cc41e62-d704-4685-92e2-fb49922d42ca INFO BatchApp start
19:03:51.146 4fcd1c9d-75fe-4396-a7a0-0af32eb066c2 INFO BatchApp end
19:04:54.914 0cc41e62-d704-4685-92e2-fb49922d42ca INFO BatchApp end

”BatchApp start”と”BatchApp end”を含む行のみ出力されるようになりました。

プロセスID毎に開始時間と終了時間を纏める

ログの出力時間、プロセスIDを読み込んだ行から取得するようにします

サンプルプログラム

f = open("c:/input/sample_log_01.txt", 'r', encoding='UTF-8')
pid = {}
while True:
   line = f.readline()
   if line:
       if line.find("BatchApp") != -1:
           split = line.split(' ')
           if line.find("start") != -1:
               pid[split[1]] = [split[0], ""]
           elif line.find("end") != -1:
               pid[split[1]][1] = split[0]
   else:
        break
f.close()
for id in pid:
   print(id + " " + pid[id][0] + " " + pid[id][1])

split関数を使って半角スペースで分割するようにして、
辞書型の変数に結果を保持するようにしました。
キーはプロセスID、開始時間と終了時間を配列で保持するようにしました。

実行結果

4fcd1c9d-75fe-4396-a7a0-0af32eb066c2 19:02:49.615 19:03:51.146
0cc41e62-d704-4685-92e2-fb49922d42ca 19:03:49.569 19:04:54.914

時間の差分を計算

プロセスID毎に開始時間と終了時間が纏められたので後は差を求めるのみ

サンプルプログラム

import datetime
f = open("c:/input/sample_log_01.txt", 'r', encoding='UTF-8')
pid = {}
while True:
   line = f.readline()
   if line:
       if line.find("BatchApp") != -1:
           split = line.split(' ')
           if line.find("start") != -1:
               pid[split[1]] = [split[0], ""]
           elif line.find("end") != -1:
               pid[split[1]][1] = split[0]
   else:
        break
f.close()
for id in pid:
   tdatetime1 = datetime.datetime.strptime(pid[id][0], '%H:%M:%S.%f')
   tdatetime2 = datetime.datetime.strptime(pid[id][1], '%H:%M:%S.%f')
   sa = tdatetime2 - tdatetime1
   total = sa.total_seconds()
   print(id + " " + str(sa) + " " + str(total))

strptime関数を使っても開始時間、終了時間を日付型に変換。
変換した値の差を求めてtotal_seconds関数で秒に変換。

実行結果

4fcd1c9d-75fe-4396-a7a0-0af32eb066c2 0:01:01.531000 61.531
0cc41e62-d704-4685-92e2-fb49922d42ca 0:01:05.345000 65.345

プロセスID毎にバッチの実行時間が出力できるようになりました。

次回の予定

本番環境では日付毎にバッチファイルが出力されまず。
一週間分程度纏めてログをもらうので任意のフォルダにログファイルを保存して日付毎に集計できるようにする。

この記事が気に入ったらサポートをしてみませんか?