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 件のコメント:
コメントを投稿