1.05.2013

Python: Using Rotating Logger

Python: ローテーション機能付きロガーの使用

Pythonでは logging モジュールにおいて、ローテーション機能付きの便利なロガーが標準で用意されている。 
(あやうく車輪の再発明をするところだった。)

ログサイズの上限を 1MB とし、バックアップを 1世代だけ残す場合には以下のようなコードを書けばよい。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import logging.handlers

# ファイルパス設定
SCRIPT_DIR = os.path.dirname(__file__)
SCRIPT_BASE_NAME = os.path.basename(__file__)
LOG_FILE = SCRIPT_DIR + '/' + SCRIPT_BASE_NAME + '.log'

# ログ設定
LOG_BACKUP_COUNT = 1  # バックアップ保持数
LOG_MAX_BYTES = 1 * (1024 ** 2)  # 洗い替えサイズ(byte)

def main():
    # ロガーオブジェクトの作成
    logger = logging.getLogger(SCRIPT_BASE_NAME)

    # ログレベルの設定
    logger.setLevel(logging.DEBUG)

    # ハンドラの設定
    handler = logging.handlers.RotatingFileHandler(
        filename=LOG_FILE, maxBytes=LOG_MAX_BYTES, backupCount=LOG_BACKUP_COUNT)

    # ログフォーマットの設定
    formatter = logging.Formatter(
        '[%(asctime)s] %(name)s %(levelname)s %(message)s')
    handler.setFormatter(formatter)

    # ロガーにハンドラを登録
    logger.addHandler(handler)

    # ログ出力テスト
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')

if __name__ == '__main__':
    main()

 

このプログラムを実行すると、実行ファイルと同じ場所に logging_example.py.log というファイルが作成され、
次のような内容が記録されるはずだ。

[2013-01-05 13:55:38,211] logging_example.py DEBUG debug message
[2013-01-05 13:55:38,211] logging_example.py INFO info message
[2013-01-05 13:55:38,211] logging_example.py WARNING warn message
[2013-01-05 13:55:38,211] logging_example.py ERROR error message
[2013-01-05 13:55:38,211] logging_example.py CRITICAL critical message

 

ファイルサイズが 1MB に到達すると、自動的にログが洗い替えされ
古いログは logging_example.py.log.1 という名前でバックアップされる。 

 

References

logging – ステータス、エラー、その他の情報をログ出力する - Python Module of the Week
http://www.doughellmann.com/PyMOTW-ja/logging/

15.7. logging — Logging facility for Python — Python v2.7.3 documentation
http://docs.python.org/2/library/logging.html

0 件のコメント:

コメントを投稿