欢迎访问宙启技术站
智能推送

Python中LOGGING模块实现日志的定时清理和压缩

发布时间:2024-01-15 00:50:11

在Python中,可以使用logging模块来实现日志的记录、清理和压缩。

下面是一个使用logging模块记录日志、定时清理和压缩日志的例子:

import logging
import logging.handlers
import datetime
import os


def setup_logging(log_file):
    # 创建logger对象
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

    # 创建文件处理器handler,将日志写入文件
    file_handler = logging.handlers.RotatingFileHandler(log_file, maxBytes=1024 * 1024, backupCount=5)  # 每个日志文件最大1MB,备份文件最多5个
    file_handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)

    # 创建控制台处理器handler,将日志输出到控制台
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_handler.setFormatter(formatter)

    # 添加处理器到logger对象
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    return logger


def clean_old_logs(log_folder, keep_days):
    now = datetime.datetime.now()
    for file_name in os.listdir(log_folder):
        file_path = os.path.join(log_folder, file_name)
        if os.path.isfile(file_path):
            # 获取文件的修改时间
            modify_time = datetime.datetime.fromtimestamp(os.path.getmtime(file_path))
            if (now - modify_time).days >= keep_days:
                os.remove(file_path)


def compress_logs(log_folder):
    for file_name in os.listdir(log_folder):
        file_path = os.path.join(log_folder, file_name)
        if os.path.isfile(file_path) and not file_name.endswith('.zip'):
            compressed_file_path = file_path + '.zip'
            with zipfile.ZipFile(compressed_file_path, 'w') as zip_file:
                zip_file.write(file_path, arcname=file_name)
            os.remove(file_path)


if __name__ == '__main__':
    log_folder = 'logs'
    log_file = os.path.join(log_folder, 'app.log')
    keep_days = 30

    # 创建日志文件夹
    if not os.path.exists(log_folder):
        os.makedirs(log_folder)

    # 设置日志
    logger = setup_logging(log_file)

    # 记录日志
    logger.debug('This is a debug message')
    logger.info('This is an info message')
    logger.warning('This is a warning message')
    logger.error('This is an error message')

    # 清理日志
    clean_old_logs(log_folder, keep_days)

    # 压缩日志
    compress_logs(log_folder)

在上面的例子中,首先通过setup_logging函数设置了日志的格式和输出方式。这里使用了RotatingFileHandler去创建文件处理器,该处理器会根据文件大小自动切分日志文件,并且保留一定数量的备份文件。

然后,记录了一些日志消息。

接着,通过clean_old_logs函数清理了超过指定天数的日志文件。

最后,通过compress_logs函数将日志文件压缩为.zip格式。这里使用了zipfile模块的ZipFile类来创建压缩文件,并使用write方法将源文件添加到压缩文件中。

注意,上述代码中使用了datetime和os模块来操作时间和文件系统。并且在运行之前,需要确保logs文件夹已经存在。

以上就是使用logging模块实现日志的定时清理和压缩的例子。通过这个例子,可以实现对日志文件的动态管理,使日志文件的大小和数量保持合理的范围,同时节省存储空间。