1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonによるログローテーションの実装

Posted at

目次

  1. 概要
  2. ログローテーションとは?
  3. 実行環境
  4. 実装方法
    4-1. ライブラリの説明
    4-2. 実装(サンプルコード紹介)
  5. 注意点
  6. まとめ
  7. 参考資料

1. 概要

本記事では、Python によるログローテーションの実装について説明します。
cron と logrotate を使用したサーバー上でのログローテーションを見かけますが、今回は Python のみを使用したログローテーションの実装になります。
Python のみでログローテーションを実装するメリットは実装が簡単なことです。
しかし logger の初期化をする必要があり、コード量が増えてしまうというデメリットも存在します。また既存コードが膨大な場合、少なからず改修が必要になってくるかと思います。
今回はログローテーションで必要な部分のみを記載しているため、各自でカスタマイズして使用していただければと思います。

※初心者向けの記事となっているため、中上級者には当たりまえかと思いますがスルーでお願いします😭

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

ログローテーションの定義を載せます。

ログローテーション
とは、システムが残す時系列の記録データ(ログ)が際限なく増えることを防ぐために、一定の容量や期間ごとに古いログを削除したり新しいログで上書きすること。また、そのような機能。

https://e-words.jp/w/ログローテーション.html より引用

システムを構築する際、デバッグのためにログを見ることが多いかと思います。またそのログは、 debug.log などといったファイル名で保存することがおおいのではないでしょうか。

ログファイルを残しておくとこのようなデメリットが発生します。

  • 1つのファイルに書き続けるとファイル容量が大きくなり、小さいインスタンスではメモリが足りずフリーズする。
  • 複数ファイルに書き込むと容量が大きくなってしまいストレージが圧迫する。(どんだけログ出しているんだって感じですが…)

正直、短期間のみ必要な情報であれば7日間のみ保存するとかでもいいですよね。

ただこちらのログローテーションを自力で実装すると工数が掛かるのは間違いなくわかると思います。そこで今回はPythonの標準ライブラリである logging を使ってログローテーションを実装していきたいと思います。こちらを使えばすぐに実装できます。

3. 実行環境

  • Windows 11
  • Python 3.10

4. 実装方法

4-1. ライブラリの説明

Python の 標準ライブラリである、 logging ライブラリを使用します。

こちらは元々インストールされている機能ですので、 pip 等でのインストールは必要ありません。
ログローテーションでは loggingTimedRotatingFileHandler または RotatingFileHandler を使用します。

  • TimedRotatingFileHandler:時間、日にち、曜日等でローテーション設定ができる。
  • RotatingFileHandler:ファイルサイズでローテーション設定ができる。

4-2. 実装(サンプルコード紹介)

import logging
from logging.handlers import TimedRotatingFileHandler

def setup_logger(name, logfile="./test.log"):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)

    handler = TimedRotatingFileHandler(logfile, when='midnight', interval=1, backupCount=7, atTime=datetime.time(0,0,0))
    handler.setLevel(logging.DEBUG)
    handler_formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')

    handler.setFormatter(handler_formatter)
    logger.addHandler(handler)
    return logger

if __name__ == "__main__":
    logger = setup_logger(__name__)
		logger.info(text)

5. 注意点

Python以外のコードでは使えないので別途書き換えか、サーバー上でローテーションする必要が出てきます。AWS Lambda等のログも今回は適用できません。LambdaはCloudWatchを使いましょう。

6. まとめ

今回は Python によるログローテーションの実装方法について書いていきました。実際の業務で使用することもできますし、普段使いでもコンソール上で出力したくないものを外部に出力できる方法として良いのではないでしょうか。

7. 参考資料

logging.handlers --- ロギングハンドラ — Python 3.10.4 ドキュメント
https://docs.python.org/ja/3/library/logging.handlers.html

Pythonのロギングを覚えた
https://qiita.com/shotakaha/items/0fa2db1dc8253c83e2bb

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?