pythonでloggingでログスクロールと期限切れログ削除機能を実現

3114 ワード

loggingライブラリには、ログスクロールに使用できるclassが2つ用意されています(参照可能https://docs.python.org/2/library/logging.handlers.html)は、1つはRotatingFileHandlerで、主にログファイルのサイズに基づいてスクロールし、もう1つはTimeRotatingFileHandlerで、主に時間に基づいてスクロールします.実際の応用では,通常時間に応じてスクロールするので,本稿では主にTimeRotaingFileHandlerの使い方(RotatingFileHandler同様)を紹介する.コードの例は次のとおりです.

#!/usr/bin/env python
#_*_coding:utf-8_*_
# vim : set expandtab ts=4 sw=4 sts=4 tw=100 :

import logging
import time
import re
from logging.handlers import TimedRotatingFileHandler
from logging.handlers import RotatingFileHandler

def main():
 #      
 log_fmt = '%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s'
 formatter = logging.Formatter(log_fmt)
 #  TimedRotatingFileHandler  
 log_file_handler = TimedRotatingFileHandler(filename="ds_update", when="M", interval=2, backupCount=2)
 #log_file_handler.suffix = "%Y-%m-%d_%H-%M.log"
 #log_file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}.log$")
 log_file_handler.setFormatter(formatter) 
 logging.basicConfig(level=logging.INFO)
 log = logging.getLogger()
 log.addHandler(log_file_handler)
 #      
 log_content = "test log"
 count = 0
 while count < 30:
  log.error(log_content)
  time.sleep(20)
  count = count + 1
 log.removeHandler(log_file_handler)


if __name__ == "__main__":
 main()

filename:ログファイル名のprefix;
when:スクロールサイクルの基本単位を記述する文字列で、文字列の値と意味は次のとおりです.
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval:スクロールサイクル、単位はwhenで指定されています.例えば、when='D'、interval=1は、毎日1つのログファイルが生成されることを示します.backupCount:ログファイルの保持個数を表す.
上記のパラメータに加えて、TimedRotatingFileHandlerには、suffixとextMatchの2つの比較的重要なメンバー変数があります.suffixとはログファイル名の接尾辞で、suffixには通常フォーマットされた時間文字列があり、filenameとsuffixは「.」接続構成ファイル名(例:filename="runtime",suffix=“%Y-%m-%d.log"であり、生成されたファイル名はruntime.2015-07-06.log)である.extMatchは、suffixとextMatchが一致しなければ、期限切れのログは削除されないログファイル名の接尾辞を一致させるためにコンパイルされた正規表現である.例えば、suffix="%Y-%m-%d.log"あ、extMatchのはre.compile(r”^\d{4}-\d{2}-\d{2}.log$”)だけです.デフォルトでは、TimedRotatingFileHandle rオブジェクトが初期化されると、suffxiとextMatchはwhenの値に基づいて初期化されます.

‘S': suffix=”%Y-%m-%d_%H-%M-%S”, extMatch=r”\^d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}”; 
‘M':suffix=”%Y-%m-%d_%H-%M”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}”; 
‘H':suffix=”%Y-%m-%d_%H”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}”; 
‘D':suffxi=”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”; 
‘MIDNIGHT':”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”; 
‘W':”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”; 

ログ・ファイル名に特別な要件がない場合は、suffixextMatchを設定する必要はありません.必要に応じて、必ず一致させます.
まとめ
以上、編集者が紹介したpythonでloggingでログのスクロールと期限切れのログ削除機能を実現しました.