Python: ローテーション機能付きロガーの使用
Pythonでは logging モジュールにおいて、ローテーション機能付きの便利なロガーが標準で用意されている。
(あやうく車輪の再発明をするところだった。)
ログサイズの上限を 1MB とし、バックアップを 1世代だけ残す場合には以下のようなコードを書けばよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #!/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 件のコメント:
コメントを投稿