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
で日時による分割- ログレベルごとのファイル分けなど実務的な応用も可能
ログ管理を自動化することで、長期運用のスクリプトやシステムにおいて信頼性が向上します。学習のコツとしては、「小さなログ出力から試してみる」「ログを日次で分割して監視ツールと連携する」など、実際の業務に近い形で試すのがおすすめです。
トラブル対応や監査対応にも役立つログローテーション、ぜひ活用してみてください。