では 複数条件でログを抽出して CSV に出力する実践的スクリプト を作ります。
目的:
- ログファイル(複数可)から
ERRORとWARNINGを抽出 - 日付・時間・ログレベル・メッセージを分解
- CSV にまとめて保存(Excel や LibreOffice Calc で開ける形式)
1. サンプルログ (log1.txt / log2.txt)
2025-11-05 10:00:00 INFO System start
2025-11-05 10:01:00 ERROR Failed to load module
2025-11-05 10:02:00 WARNING Low memory
2025-11-05 10:03:00 ERROR Connection timeout
2025-11-06 09:00:00 INFO User login
2025-11-06 09:05:00 WARNING Disk almost full
2. Python スクリプト例
import re
import csv
import glob
# ログファイルのリスト(例:log*.txt)
log_files = glob.glob("log*.txt")
# 正規表現パターン
# 日付、時間、レベル、メッセージを抽出
pattern = re.compile(r"(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (ERROR|WARNING) (.*)")
# 出力 CSV ファイル
output_csv = "error_warning_logs.csv"
# CSV 書き込み準備
with open(output_csv, "w", newline="", encoding="utf-8") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["Date", "Time", "Level", "Message"]) # ヘッダー
# 複数ファイルを処理
for logfile in log_files:
with open(logfile, "r", encoding="utf-8") as f:
for line in f:
match = pattern.search(line)
if match:
date, time, level, message = match.groups()
writer.writerow([date, time, level, message])
print(f"処理完了!{output_csv} に結果を保存しました。")
Python3. スクリプト解説
- 複数ファイル処理
log_files = glob.glob("log*.txt")
Pythonlog*.txtにマッチする全ファイルをリスト化log1.txt, log2.txt, …をまとめて処理できる
- 正規表現
pattern = re.compile(r"(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (ERROR|WARNING) (.*)")
Python(\d{4}-\d{2}-\d{2})→ 年-月-日(\d{2}:\d{2}:\d{2})→ 時:分:秒(ERROR|WARNING)→ ログレベル(.*)→ メッセージ全体
- CSV 書き込み
writer.writerow([date, time, level, message])
Python- リストをそのまま書き込むと CSV の各列になる
- Excel などで簡単に読み込める形式
- 条件抽出
search()で行全体をチェックERRORとWARNINGだけ抽出(正規表現の(ERROR|WARNING)がポイント)
4. 応用アイデア
- 時間帯でフィルタ
if "10:00" <= time <= "12:00":
writer.writerow([date, time, level, message])
Python- 特定のキーワードで絞り込み
if "module" in message:
writer.writerow([date, time, level, message])
Python- 日ごとに CSV 分割
output_csv = f"{date}_error_warning.csv"
Python- 日付ごとにファイルを分けることで、後で分析がしやすい
- 複雑なパターン
- メールアドレスや IP アドレスを含むログ行の抽出
pattern = re.compile(r"(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) (ERROR|WARNING) .*?(\d{1,3}(?:\.\d{1,3}){3}).*")
Python5. 練習課題(ステップアップ)
- ログファイルから
ERRORだけを抽出し、重要度別に CSV を分ける(メッセージに “timeout” があれば高、そうでなければ低) - 複数のサブフォルダにあるログファイルを再帰的に処理するスクリプトを作る
- 抽出したログの件数を レベルごとに集計して、CSV に書き出す
