ログファイル整理は「溜まり続けるログを自動で管理し、容量圧迫や検索性の低下を防ぐ」ための基礎スキル
業務システムは毎日ログを出力し続けるため、放置するとフォルダが肥大化し、検索性が悪くなり、最悪ディスク容量を圧迫します。Python を使うと、古いログの削除・日付ごとの仕分け・圧縮・アーカイブ化などを自動化できます。ここでは初心者でも扱えるように、基本操作から実務テンプレートまで順を追って解説します。
日付ごとにログを仕分ける基本(ログ整理の第一歩)
ログの先頭に日付がある場合の仕分けテンプレート
import os
def split_logs_by_date(src, out_dir):
os.makedirs(out_dir, exist_ok=True)
files = {}
with open(src, "r", encoding="utf-8") as f:
for line in f:
date = line[:10] # 例: "2024-03-15"
if date not in files:
files[date] = open(os.path.join(out_dir, f"{date}.log"), "a", encoding="utf-8")
files[date].write(line)
for f in files.values():
f.close()
split_logs_by_date("access.log", "daily_logs")
Python重要ポイント
- ログの先頭に日付がある前提で、
line[:10]で日付を抽出 - 日付ごとにファイルを自動生成し、ログを振り分ける
- 大量ログを「日別フォルダ」に整理する実務で非常に役立つ
古いログを自動削除する(容量圧迫対策の基本)
更新日時を基準に「◯日より古いログ」を削除する
import os
import time
def delete_old_logs(folder, days):
limit = time.time() - days * 86400
for name in os.listdir(folder):
path = os.path.join(folder, name)
if os.path.isfile(path):
if os.path.getmtime(path) < limit:
os.remove(path)
print("削除:", path)
delete_old_logs("daily_logs", 30) # 30日より古いログを削除
Python深掘りポイント
mtime(更新日時)を使うことで「いつ生成されたか」を判断- 30日・90日など、運用ルールに合わせて調整可能
- 容量圧迫の原因を自動で排除できる
ログを圧縮してアーカイブ化する(長期保存向け)
日付フォルダをまとめて ZIP 圧縮する例
import os
import zipfile
def compress_logs(folder, zip_name):
with zipfile.ZipFile(zip_name, "w", zipfile.ZIP_DEFLATED) as z:
for name in os.listdir(folder):
path = os.path.join(folder, name)
if os.path.isfile(path):
z.write(path, arcname=name)
compress_logs("daily_logs", "logs_archive.zip")
Python深掘りポイント
- ZIP 圧縮で容量を大幅削減
arcnameを指定することで ZIP 内のフォルダ構造を整えられる- 圧縮後に元ログを削除すればさらに容量節約
ログファイルを日付フォルダに自動移動する(整理しやすい構造を作る)
ログファイル名に日付が含まれている場合
import os
import shutil
def move_logs_by_filename(src_folder, dst_folder):
os.makedirs(dst_folder, exist_ok=True)
for name in os.listdir(src_folder):
if name.endswith(".log"):
date = name[:10] # 例: "2024-03-15_xxx.log"
target = os.path.join(dst_folder, date)
os.makedirs(target, exist_ok=True)
shutil.move(os.path.join(src_folder, name), os.path.join(target, name))
move_logs_by_filename("logs", "sorted_logs")
Python深掘りポイント
- ログファイル名に日付が含まれている場合に有効
- 日付フォルダを自動生成して整理できる
- 大量ログのフォルダ構造を整えるのに最適
ログローテーション(世代管理)を Python で実装する
最新◯世代だけ残し、それ以外を削除する
import os
def rotate_logs(folder, keep=5):
logs = []
for name in os.listdir(folder):
path = os.path.join(folder, name)
if os.path.isfile(path):
logs.append((os.path.getmtime(path), path))
logs.sort(reverse=True)
for _, path in logs[keep:]:
os.remove(path)
print("削除:", path)
rotate_logs("daily_logs", keep=7)
Python深掘りポイント
- 更新日時でソートし、新しい順に並べる
- 最新7世代だけ残すなど、運用ルールに合わせて調整可能
- バックアップ運用でも使われる「世代管理」の基本
ログの中から特定キーワードを含む行だけ抽出する(解析用)
エラー行だけ抽出する例
def extract_error_lines(src, dst):
with open(src, "r", encoding="utf-8") as f, open(dst, "w", encoding="utf-8") as out:
for line in f:
if "ERROR" in line:
out.write(line)
extract_error_lines("access.log", "error_only.log")
Python深掘りポイント
- ログ解析の第一歩は「必要な行だけ抽出」
- ERROR / WARNING / INFO などで分類できる
- 大量ログの分析前処理として非常に重要
pathlib を使った読みやすいログ整理コード
Path オブジェクトで直感的に書ける
from pathlib import Path
def delete_old_logs_path(folder: Path, days: int):
limit = time.time() - days * 86400
for p in folder.iterdir():
if p.is_file() and p.stat().st_mtime < limit:
p.unlink()
print("削除:", p)
delete_old_logs_path(Path("daily_logs"), 30)
Pythonメリット
p.stat()でメタ情報を簡単に取得unlink()で削除- パス操作が読みやすく、保守性が高い
ログ整理を業務で設計するときの視点
- 日付ごとに仕分けると検索性が大幅に向上する
- 古いログの削除は容量圧迫対策として必須
- 圧縮アーカイブ化で長期保存が容易になる
- ログローテーション(世代管理)は安定運用の基本
- キーワード抽出で解析前処理を自動化できる
