\

PythonでログファイルをZIP形式で圧縮する方法を解説します。Pythonの標準ライブラリの一つであるloggingモジュールを使用します。

まず、RotatingFileHandlerというハンドラを使用してログファイルのローテーションを行います。このハンドラは、ログファイルが一定のサイズに達すると新しいファイルに切り替える機能を提供します。

しかし、このままではローテーションした古いログファイルは圧縮されません。そこで、RotatingFileHandlernamerrotatorという二つのインスタンス変数に関数を代入することで、ローテーションしたログファイルをgzip形式で圧縮することができます。

以下に、具体的なコード例を示します。

import os
import shutil
import gzip
import datetime
import logging
import logging.handlers

def main():
    logger = create_logger(__name__)
    logger.debug('foobar')
    logger.info('foobar')
    logger.warning('foobar')
    logger.error('foobar')
    logger.critical('foobar')

def create_logger(name):
    logger = logging.getLogger(name)
    formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(filename)s - '
                                  '%(funcName)s: %(message)s', '%Y-%m-%d %H:%M:%S')
    handler = logging.handlers.RotatingFileHandler(
        filename='log.txt',
        backupCount=5,
        maxBytes=100,
    )
    handler.setLevel(logging.DEBUG)
    handler.setFormatter(formatter)
    logger.setLevel(logging.DEBUG)
    logger.addHandler(handler)

    def gzip_namer(name):
        return name + '.gz'

    def gzip_rotator(src, dst):
        src_tmp = src + '.tmp' + datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')
        os.rename(src, src_tmp)
        dst_tmp = src
        with open(src_tmp, 'rb') as sf:
            with gzip.open(dst_tmp, 'wb') as df:
                shutil.copyfileobj(sf, df)
        os.rename(dst_tmp, dst)
        os.remove(src_tmp)

    handler.namer = gzip_namer
    handler.rotator = gzip_rotator

    return logger

if __name__ == '__main__':
    main()

このコードでは、create_logger関数でロガーオブジェクトを生成しています。この関数内で、ローテーションしたログファイルをgzip形式で圧縮するための関数gzip_namergzip_rotatorを用意して、前述の二つのインスタンス変数への代入を行っています。

このように、Pythonのloggingモジュールとgzipを組み合わせることで、ログファイルのローテーションと圧縮を同時に行うことができます。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です