Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - ログファイル整理

Python Python
スポンサーリンク

ログファイル整理は「溜まり続けるログを自動で管理し、容量圧迫や検索性の低下を防ぐ」ための基礎スキル

業務システムは毎日ログを出力し続けるため、放置するとフォルダが肥大化し、検索性が悪くなり、最悪ディスク容量を圧迫します。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() で削除
  • パス操作が読みやすく、保守性が高い

ログ整理を業務で設計するときの視点

  • 日付ごとに仕分けると検索性が大幅に向上する
  • 古いログの削除は容量圧迫対策として必須
  • 圧縮アーカイブ化で長期保存が容易になる
  • ログローテーション(世代管理)は安定運用の基本
  • キーワード抽出で解析前処理を自動化できる

タイトルとURLをコピーしました