PythonでログファイルをZIP形式で圧縮する方法を解説します。Pythonの標準ライブラリの一つであるloggingモジュールを使用します。
まず、RotatingFileHandlerというハンドラを使用してログファイルのローテーションを行います。このハンドラは、ログファイルが一定のサイズに達すると新しいファイルに切り替える機能を提供します。
しかし、このままではローテーションした古いログファイルは圧縮されません。そこで、RotatingFileHandlerのnamerとrotatorという二つのインスタンス変数に関数を代入することで、ローテーションしたログファイルを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_namerとgzip_rotatorを用意して、前述の二つのインスタンス変数への代入を行っています。
このように、Pythonのloggingモジュールとgzipを組み合わせることで、ログファイルのローテーションと圧縮を同時に行うことができます。