Python|ログファイルのローテーション処理

1. はじめに

Pythonでログを記録する際、ログファイルが肥大化して扱いづらくなることがあります。そんなときに役立つのがログファイルのローテーション処理です。本記事では、Pythonでログファイルを自動的にローテーション(一定サイズや日時で分割)する方法について、初心者にもわかりやすく解説します。

logging.handlersモジュールを使えば、ログが定期的にローテートされ、古いログを自動的にバックアップ保存できます。業務システムやサーバースクリプトにおいて、ログ管理の自動化は非常に重要なポイントです。

 

2. Pythonのログローテーション処理の基本

ログローテーションとは?

ログローテーションとは、一定条件(ファイルサイズや時間)でログファイルを分割し、古いファイルを保存・管理する仕組みです。これにより、ログファイルが大きくなりすぎて扱いづらくなるのを防げます。

Pythonでの基本的な実装例

Pythonの標準ライブラリlogging.handlersを使えば、ファイルサイズや時間でローテーションを行う処理が簡単に書けます。以下は、ログファイルのサイズが1MBを超えたらローテートする例です。

import logging
from logging.handlers import RotatingFileHandler

# ロガーの設定
logger = logging.getLogger("MyLogger")
logger.setLevel(logging.INFO)

# ローテーション設定(1MBで最大3ファイルまで保存)
handler = RotatingFileHandler("my_log.log", maxBytes=1_000_000, backupCount=3)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

logger.addHandler(handler)

# ログ出力
for i in range(10000):
    logger.info(f"ログメッセージ {i}")

実行結果:

my_log.log(ログファイル)に出力
サイズが1MBを超えると自動的に my_log.log.1, my_log.log.2 に切り替わる

ポイント: maxBytesで分割サイズ、backupCountで保存するファイル数を指定します。

 

3. よくある使い方・応用例

日付でログをローテーションする(TimedRotatingFileHandler)

ファイルサイズではなく、日単位や時間単位でログをローテートしたい場合は、TimedRotatingFileHandlerを使います。

import logging
from logging.handlers import TimedRotatingFileHandler

logger = logging.getLogger("TimedLogger")
logger.setLevel(logging.INFO)

# 毎日0時にログファイルをローテート。7日分保持。
handler = TimedRotatingFileHandler("timed_log.log", when="midnight", interval=1, backupCount=7, encoding="utf-8")
formatter = logging.Formatter('%(asctime)s - %(message)s')
handler.setFormatter(formatter)

logger.addHandler(handler)

logger.info("日付ローテーションログ開始")

実行結果:

timed_log.log に出力され、毎日0時に timed_log.log.YYYY-MM-DD にローテートされる

ログレベルごとにファイルを分ける

INFOとERRORなど、ログレベルごとにローテーションファイルを分けることで、トラブルシューティングがしやすくなります。

# INFOログ用
info_handler = RotatingFileHandler("info.log", maxBytes=100000, backupCount=2)
info_handler.setLevel(logging.INFO)

# ERRORログ用
error_handler = RotatingFileHandler("error.log", maxBytes=100000, backupCount=2)
error_handler.setLevel(logging.ERROR)

info_handler.setFormatter(formatter)
error_handler.setFormatter(formatter)

logger.addHandler(info_handler)
logger.addHandler(error_handler)

logger.info("情報ログ")
logger.error("エラーログ")

実行結果:

info.log には INFO以上のログ、error.log には ERROR以上のログがそれぞれローテートされて保存される

 

4. 注意点・エラー対策

ログがローテートされない?

RotatingFileHandlerを使ってもログが分割されない場合は、以下の点を確認しましょう:

  • maxBytesが十分小さいか(ログの出力量が足りていない)
  • logger.setLevel()でログレベルが正しく設定されているか
  • ハンドラーがloggerに正しくaddHandler()されているか

ファイル名の競合に注意

複数のプロセスから同時に同じログファイルを書き込む場合、ファイルロックが発生しないため、ファイルの破損や記録漏れの可能性があります。対策としては、プロセスごとにログファイルを分けるか、外部ログ収集基盤の導入を検討しましょう。

ファイルサイズの単位ミス

maxBytes=1000とした場合、たった1KBでローテーションされてしまいます。1_000_000(約1MB)など、単位ミスに注意しましょう。

 

5. まとめ

本記事では、Pythonでログファイルをローテーション処理する方法について、基本構文から応用例まで紹介しました。

  • RotatingFileHandlerでサイズによる分割
  • TimedRotatingFileHandlerで日時による分割
  • ログレベルごとのファイル分けなど実務的な応用も可能

ログ管理を自動化することで、長期運用のスクリプトやシステムにおいて信頼性が向上します。学習のコツとしては、「小さなログ出力から試してみる」「ログを日次で分割して監視ツールと連携する」など、実際の業務に近い形で試すのがおすすめです。

トラブル対応や監査対応にも役立つログローテーション、ぜひ活用してみてください。

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