python_logging日志模块按大小和时间分割方法

前言

  Python的logging模块是一个强大的日志记录工具,用于记录应用程序运行时的信息、警告和错误。

一、按大小分割日志文件

import logging
import os
from logging.handlers import RotatingFileHandler

# 定义默认日志格式
"""
%(asctime)s   :日志记录的时间
%(levelname)s :日志级别
%(message)s   :日志消息的内容
%(name)s      :日志记录器的名称
%(filename)s  :源代码文件名称
%(lineno)d    :源代码文件中的行号
%(funcName)s  :调用日志记录的函数名
"""
LOG_FORMAT = "%(asctime)s %(levelname)s [%(filename)s: %(lineno)d] %(message)s"

# 定义默认(记录和文件输出)日志级别: DEBUG、INFO、WARNING、ERROR、CRITICAL
DEFAULT_LEVEL = logging.DEBUG

# 定义输出控制台日志级别
CONSOLE_LEVEL = logging.ERROR

# 定义默认日志文件目录
LOG_DIR = "logs"

# 定义默认日志文件最大字节数(2M)
LOG_MAX_BYTES = 2 * 1024 * 1024

# 定义默认日志文件备份个数
LOG_BACKUP_COUNT = 5


def create_logger(logger_name=None,
                  log_file=None,
                  level=DEFAULT_LEVEL,
                  console_level=CONSOLE_LEVEL,
                  log_format=LOG_FORMAT,
                  log_dir=LOG_DIR,
                  log_max_bytes=LOG_MAX_BYTES,
                  log_backup_count=LOG_BACKUP_COUNT):
    """
    创建一个新的 Logger 对象,并进行基本配置

    :param logger_name: Logger 名称,默认为 None, 表示使用模块名称
    :param log_file: 日志文件名称,如果为 None, 则不写入文件
    :param level: 日志级别(记录和文件输出),默认为 DEFAULT_LEVEL
    :param console_level: 输出控制台日志级别,默认 CONSOLE_LEVEL
    :param log_format: 日志格式,默认为 LOG_FORMAT
    :param log_dir: 日志文件目录,默认为 LOG_DIR
    :param log_max_bytes: 日志文件最大字节数,默认为 LOG_MAX_BYTES
    :param log_backup_count: 日志文件备份个数,默认为 LOG_BACKUP_COUNT
    :return: Logger 对象
    """
    logger = logging.getLogger(logger_name)
    logger.setLevel(level)

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

    # 配置控制台输出
    console_handler = logging.StreamHandler()
    console_handler.setLevel(console_level)
    console_handler.setFormatter(logging.Formatter(log_format))
    logger.addHandler(console_handler)

    # 配置文件输出
    if log_file:
        log_file = os.path.join(log_dir, log_file)
        file_handler = RotatingFileHandler(
            filename=log_file,
            maxBytes=log_max_bytes,
            backupCount=log_backup_count,
            encoding='utf-8'
        )
        file_handler.setLevel(level)
        file_handler.setFormatter(logging.Formatter(log_format))
        logger.addHandler(file_handler)

    return logger


if __name__ == "__main__":
    logger = create_logger(logger_name=__name__, log_file="mylog.log")
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')

二、按时间分割日志文件

import logging
import os
from logging.handlers import TimedRotatingFileHandler

# 定义默认日志格式
"""
%(asctime)s   :日志记录的时间
%(levelname)s :日志级别
%(message)s   :日志消息的内容
%(name)s      :日志记录器的名称
%(filename)s  :源代码文件名称
%(lineno)d    :源代码文件中的行号
%(funcName)s  :调用日志记录的函数名
"""
LOG_FORMAT = "%(asctime)s %(levelname)s [%(filename)s: %(lineno)d] %(message)s"

# 定义默认(记录和文件输出)日志级别: DEBUG、INFO、WARNING、ERROR、CRITICAL
DEFAULT_LEVEL = logging.DEBUG

# 定义输出控制台日志级别
CONSOLE_LEVEL = logging.ERROR

# 定义默认日志文件目录
LOG_DIR = "logs"

# 定义默认日志切割的时间单位,比如 'S'(秒)、'M'(分)、'H'(小时)、'D'(天)等
WHEN = "H"

# 定义默认日志文件切割的时间间隔,例如当 when='H' 且 interval=1 时,表示每隔一个小时进行一次切割,并生成一个新的日志文件
INTERVAL = 1

# 定义默认保留旧日志文件的个数(如果超过这个数量,则会自动删除最早的日志文件),默认值为 0,表示不自动删除旧日志文件
BACKUPCOUNT = 0


def create_logger(logger_name=None,
                  log_file=None,
                  level=DEFAULT_LEVEL,
                  console_level=CONSOLE_LEVEL,
                  log_format=LOG_FORMAT,
                  log_dir=LOG_DIR,
                  when=WHEN,
                  interval=INTERVAL,
                  backupCount=BACKUPCOUNT):
    """
    创建一个新的 Logger 对象,并进行基本配置

    :param logger_name: Logger 名称,默认为 None, 表示使用模块名称
    :param log_file: 日志文件名称,如果为 None, 则不写入文件
    :param level: 日志级别(记录和文件输出),默认为 DEFAULT_LEVEL
    :param console_level: 输出控制台日志级别,默认 CONSOLE_LEVEL
    :param log_format: 日志格式,默认为 LOG_FORMAT
    :param log_dir: 日志文件目录,默认为 LOG_DIR
    :param when: 日志文件切割时间单位,默认为 WHEN
    :param interval: 日志文件切割间隔时间,默认为 INTERVAL
    :param backupCount: 日志文件备份个数,默认为 BACKUPCOUNT
    :return: Logger 对象
    """
    logger = logging.getLogger(logger_name)
    logger.setLevel(level)

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

    # 配置控制台输出
    console_handler = logging.StreamHandler()
    console_handler.setLevel(console_level)
    console_handler.setFormatter(logging.Formatter(log_format))
    logger.addHandler(console_handler)

    # 配置文件输出
    if log_file:
        log_file = os.path.join(log_dir, log_file)
        file_handler = TimedRotatingFileHandler(log_file,
                                                when=when,
                                                interval=interval,
                                                backupCount=backupCount,
                                                encoding='utf-8')
        file_handler.setLevel(level)
        file_handler.setFormatter(logging.Formatter(log_format))
        logger.addHandler(file_handler)

    return logger


if __name__ == "__main__":
    logger = create_logger(logger_name=__name__, log_file="mylog.log")
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warning message')
    logger.error('error message')
    logger.critical('critical message')

你可能感兴趣的:(#,日常记录,python)