【Python】ログファイルを『時間でローテーション』するコード例 TimedRotatingFileHandler

Python の TimedRotatingFileHandlerタイムド ローテーティング ファイル ハンドラ でログ出力するコードれいです。

『ログ出力』と『ログファイルの時間経過によるローテーション』は、TimedRotatingFileHandler() を使うとできました。

ログファイルを自動で分割しながら、テキストファイルに出力することができました。

古いログも、自動でリネームして、ログファイルをローテーションして、残してくれました。

コマンドプロンプトには何も表示されず、『ファイル』だけに出力できました。

ログ分割のタイミング設定 when には、秒、分、時、日、曜日などの選択肢がありました。

ログのバックアップのかず backupCount を指定したら、その数だけ、分割後の古いログを残してくれました。

時間の経過で、古いログが『流れて消えていく仕組み』を作ることができました。

また、ログのバックアップの数を、デフォルトの backupCount=0 にしたら、分割後の古いログがすべて残りました。

ファイルの数は無制限に増えていきましたが、すべてのログを保存することができました。

使用したライブラリ

Python 公式マニュアルの場所です。

logging モジュール

logging.handlers パッケージ

time モジュール

組み込み機能

コード例

時間経過でログファイルをローテーションする Python コード例です。

タイムド ローテーティング ファイルハンドラ TimedRotatingFileHandler() を使います。

※(2020年6月18日 追記)logging.getLogger() で取得したロガー lg は、『グローバル』で持つほうが、便利で適切だと思います。コード例では関数の中に入れたままですが、必ずしもそうする必要は無いと思ったため、補足として追記します。

"""TimedRotatingFileHandlerでログ出力するPythonコード例"""

import logging
import logging.handlers
import time

def main():
    """メイン関数"""

    # ロガーを取得
    lg = logging.getLogger(__name__)
    lg.setLevel(logging.DEBUG)

    # タイムドローテーティングファイルハンドラを作成 & ロガーに追加
    th = logging.handlers.TimedRotatingFileHandler(
        r'F:\apps\data\th.log', encoding='utf-8',
        when='S',
        interval=10,
        backupCount=5,
        )
    th.setLevel(logging.DEBUG)
    th.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
    lg.addHandler(th)

    lg.debug('start')

    # (コード例) 架空の気温でログレベルを分けてみる
    temperatures = [
        20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
        30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
        40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
        ]
    for t in temperatures:
        # 1秒待つ
        time.sleep(1)

        if t < 24:
            lg.debug(f'debug 気温 {t} ℃')
        elif 24 <= t < 28:
            lg.info(f'info 暑さに注意 {t} ℃')
        elif 28 <= t < 31:
            lg.warning(f'warning 暑さに警戒 {t} ℃')
        elif 31 <= t < 36:
            lg.error(f'error 暑さに厳重警戒 {t} ℃')
        elif 36 <= t:
            lg.critical(f'critical 危険な気温です {t} ℃')

    lg.debug('end')
    return

if __name__ == '__main__':
    main()

ロガーとハンドラには、深刻度しんこくどの低い logging.DEBUG をセットしました。

なので、どのログレベルの出力も記録されるはず。

ログのローテーションは、when=’S’ と interval=10で、10秒を指定しました。

なので、10秒経過するごとに、ログファイルのローテーションが発生するはず。

実行結果

ログファイル (th.log) の内容です。

拡張子 .log の後ろの日時は、TimedRotatingFileHandler が、自動で追加したものです。

th は TimedRotatingFileHandler の略です。

th.log

2019-11-22 22:15:15,729 critical 危険な気温です 49 ℃
2019-11-22 22:15:15,743 end

th.log.2019-11-22_22-15-05

2019-11-22 22:15:05,714 critical 危険な気温です 39 ℃
2019-11-22 22:15:06,728 critical 危険な気温です 40 ℃
2019-11-22 22:15:07,728 critical 危険な気温です 41 ℃
2019-11-22 22:15:08,728 critical 危険な気温です 42 ℃
2019-11-22 22:15:09,728 critical 危険な気温です 43 ℃
2019-11-22 22:15:10,728 critical 危険な気温です 44 ℃
2019-11-22 22:15:11,728 critical 危険な気温です 45 ℃
2019-11-22 22:15:12,728 critical 危険な気温です 46 ℃
2019-11-22 22:15:13,729 critical 危険な気温です 47 ℃
2019-11-22 22:15:14,729 critical 危険な気温です 48 ℃

th.log.2019-11-22_22-14-55

2019-11-22 22:14:55,713 warning 暑さに警戒 29 ℃
2019-11-22 22:14:56,714 warning 暑さに警戒 30 ℃
2019-11-22 22:14:57,714 error 暑さに厳重警戒 31 ℃
2019-11-22 22:14:58,714 error 暑さに厳重警戒 32 ℃
2019-11-22 22:14:59,714 error 暑さに厳重警戒 33 ℃
2019-11-22 22:15:00,714 error 暑さに厳重警戒 34 ℃
2019-11-22 22:15:01,714 error 暑さに厳重警戒 35 ℃
2019-11-22 22:15:02,714 critical 危険な気温です 36 ℃
2019-11-22 22:15:03,714 critical 危険な気温です 37 ℃
2019-11-22 22:15:04,714 critical 危険な気温です 38 ℃

th.log.2019-11-22_22-14-45

2019-11-22 22:14:45,712 start
2019-11-22 22:14:46,712 debug 気温 20 ℃
2019-11-22 22:14:47,712 debug 気温 21 ℃
2019-11-22 22:14:48,712 debug 気温 22 ℃
2019-11-22 22:14:49,712 debug 気温 23 ℃
2019-11-22 22:14:50,712 info 暑さに注意 24 ℃
2019-11-22 22:14:51,712 info 暑さに注意 25 ℃
2019-11-22 22:14:52,712 info 暑さに注意 26 ℃
2019-11-22 22:14:53,712 info 暑さに注意 27 ℃
2019-11-22 22:14:54,712 warning 暑さに警戒 28 ℃

どのログレベルも、ファイルに記録されていました。

また、指定した時間の経過で、ログが分割されていました。

ファイル名の末尾に追加された日時の秒数から、10秒間隔でローテーションが発生していたのが分かります。

成功です。

スポンサーリンク
Python評価
シェアする(押すとSNS投稿用の『編集ページ』に移動します)
フォローする(RSSフィードに移動します)
スポンサーリンク
シラベルノート
タイトルとURLをコピーしました