概要
仕事をしていると特定の処理が開始されてから終了するまでの時間、つまり「処理時間」を計算することが必要になることがあります。特にログファイルを見て特定の処理時間を確認する場合や全体の処理時間を確認する場合です。けれど、ログファイルは通常、大量データとなるため、手作業で処理時間を計算することはかなり大変です。そこで、この記事では、PythonとPandasライブラリを使用して、ログデータから処理時間を計算するプログラムを紹介します。
処理時間計測の要件
今回のログファイルは以下を想定しています。
- ログファイルはCSVデータ
- STARTやENDといった行があってその差を求めることで処理時間とする
- マルチスレッド処理を想定しログ内には同一処理(同一ユーザの操作など)を判定する情報がある
サンプルCSV
log.csv
2024/02/01 09:10:00,XYZ,0001,START
2024/02/01 09:11:11,ABC,0002,処理1開始
2024/02/01 09:22:22,XYZ,0002,処理1開始
2024/02/01 10:00:00,ABC,0003,処理1終了
2024/02/01 11:00:00,XYZ,0003,処理1終了
2024/02/02 03:00:00,ABC,0009,END
2024/02/03 01:00:00,XYZ,0009,END
- XYZ/ABC を同一処理を判定するユーザIDとして扱います
- 今回はシンプルにSTART/END間の処理時間を計算しますが、0002/0003間の処理時間というパターンもあると思います
動作環境
- Python 3.10.12
- Pythonライブラリ(pandas 1.5.3)
サンプルプログラム
以下に、ログデータから処理時間を計算するPythonプログラムを示します。このプログラムは、各リクエストの開始(START)と終了(END)の時間差を計算します
0002/0003間を計測したい場合は適宜書き換えてください
python
import pandas as pd
from io import StringIO
csv_data = """
2024/02/01 09:00:00,ABC,0001,START
2024/02/01 09:10:00,XYZ,0001,START
2024/02/01 09:11:11,ABC,0002,処理1開始
2024/02/01 09:22:22,XYZ,0002,処理1開始
2024/02/01 10:00:00,ABC,0003,処理1終了
2024/02/01 11:00:00,XYZ,0003,処理2終了
2024/02/02 03:00:00,ABC,0009,END
2024/02/03 01:00:00,XYZ,0009,END
"""
# StringIO を使用してファイルライクなオブジェクトを作成
data = StringIO(csv_data)
# データをDataFrameに変換
df = pd.read_csv(data, header=None, names=['Timestamp', 'UserID', 'LogNumber', 'ActionMsg'])
# 時間差計算を行うカラムをタイムスタンプ型に変更
df["Timestamp"] = pd.to_datetime(df["Timestamp"])
print(df)
# STARTとENDの行を抽出
start_rows = df[df["ActionMsg"] == "START"]
end_rows = df[df["ActionMsg"] == "END"]
# IDごとに時間差を計算の結果を格納する
result = []
# 時間差計算
for userid in df["UserID"].unique():
start_time = start_rows[start_rows["UserID"] == userid]["Timestamp"].values
end_time = end_rows[end_rows["UserID"] == userid]["Timestamp"].values
if len(start_time) > 0 and len(end_time) > 0:
time_difference = (end_time[0] - start_time[0])
result.append({"UserID": userid, "Time Difference": time_difference})
if result:
result_df = pd.DataFrame(result)
print(result_df)
else:
print("No valid pairs of 'START' and 'END' found.")
出力結果
START/END間がABCとXYZで正しく計算されています。
UserID Time Difference
0 ABC 0 days 18:00:00
1 XYZ 1 days 15:50:00
サンプルプログラム補足
このプログラムは、以下の手順で処理時間を計算します。
- データフレームの作成: まず、CSVデータをPandasのデータフレームに変換します。この例では、'Timestamp', 'UserID', 'LogNumber', 'ActionMsg'という4つの列を持つデータフレームを作成しています
- 同一処理の取得: 次に、データフレームから同一処理を抽出します。これは、データフレームの’UserID’列の一意の値を取得することで実現しました
- ユーザIDごとの処理時間の計算: 最後に、各ユーザIDの開始時間と終了時間を抽出し、その差(つまり、処理時間)を計算します。これは、データフレームの’Timestamp’列の差を計算することで実現しました
まとめ
以上がログデータから処理時間を計算するPythonプログラムの紹介と解説です。このプログラムを使用することで、大量のログデータから必要な情報を効率的に抽出し、システムのパフォーマンスを評価することが可能になります。
私の力量として比較的シンプル書けた気がするのですが良いアドバイスある方いたらコメントください!