一つのログへ追記し続けると、調査する前にファイルが大きくなりすぎることがあります。サイズに応じてファイルを切り替え、過去分の数も決めるなら、RotatingFileHandlerを使えます。
現在のログとは別に、run.log.1、run.log.2のような世代を持つ形です。サイズと世代数による管理と、何日保管するかという方針は別なので、必要な記録が残る条件も合わせて考えます。
小さな上限で切替を確認
次は一時フォルダーへ十二件の架空ログを出す例です。切替を見やすくするためmaxBytesを80、過去分を二世代にしています。実際のアプリのログ設定は変更しません。
import logging
from logging.handlers import RotatingFileHandler
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
path = Path(directory) / "run.log"
logger = logging.Logger("practice_rotation")
logger.setLevel(logging.INFO)
handler = RotatingFileHandler(
path, maxBytes=80, backupCount=2, encoding="utf-8"
)
handler.setFormatter(logging.Formatter("%(message)s"))
logger.addHandler(handler)
try:
for number in range(12):
logger.info("record-%02d-xxxxxxxxxxxxxxxx", number)
finally:
logger.removeHandler(handler)
handler.close()
names = sorted(item.name for item in Path(directory).iterdir())
latest = path.read_text(encoding="utf-8")
print("保存された名前:", names)
print("最後の記録あり:", "record-11" in latest)
assert names == ["run.log", "run.log.1", "run.log.2"]
assert "record-11" in latest
現在のrun.logと過去二世代の三ファイルになり、最新のログへ最後の記録が残ります。Windows・Python 3.12.10で、この切替を確認しました。実運用の保管期間や容量を測った例ではありません。
数値を0のままにしない
maxBytesは切替のためのサイズ、backupCountは残す過去ファイルの数です。どちらかが0なら、このハンドラーのローテーションは起こりません。既定値のままで分割されると考えず、両方を設定します。
上限サイズはディスク全体の容量制限ではありません。非常に長い一件や、ほかのログ、一時ファイルなども存在します。ファイルが分かれたことだけで容量不足を防げるとは判断しません。
何日分が残るかは件数で変わる
同じサイズ設定でも、一日に多く出す処理ほど古いログが早く置き換わります。一か月保管が必要なら、サイズと世代数だけで一か月を保証することはできません。時間による切替や別の保管先など、要件に合う方法を検討します。
一つの処理から書く例を、複数プロセスが同じログを同時に回す構成へそのまま広げないようにします。書き込み先を分ける、集約する仕組みを用意するなど、同時実行の条件も確認します。
分割しても内容は絞る
ログに個人情報やAPIキーを出していれば、ファイルが分かれても機密情報は残ります。原因を追うための実行ID、件数、結果など、必要な項目へ絞ってください。
設定後は、切替が起こったときのファイル名、最新の記録、古い世代が置き換わる順を小さなコピーで確かめます。消したくない調査用ログを控える手順も、通常のローテーションとは分けて持てます。
記録する項目はlogging入門、別に残す控えはバックアップ設計で補えます。
参考資料
logging.handlersとloggingの公式資料を2026年11月1日に確認しました。
