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