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


    前言

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

    一、按大小分割日志文件

    import logging
    import os
    import sys
    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
    WRITE_LEVEL = logging.DEBUG
    
    # 定义输出控制台日志级别
    CONSOLE_LEVEL = logging.INFO
    
    # 定义输出文件日志级别
    FILE_LEVEL = logging.ERROR
    
    # 日志文件存放路径,如不需要路径,填写 None
    FILE_PATH = "logs"
    
    # 日志文件名称
    LOG_FILE_NAME = "mylog.log"
    
    # 定义默认日志文件最大字节数(2M)
    LOG_MAX_BYTES = 2 * 1024 * 1024
    
    # 定义默认日志文件备份个数
    LOG_BACKUP_COUNT = 5
    
    
    def create_logger(logger_name=None):
        """日志记录模块"""
        # 获取当前脚本所在的目录路径。该方法获取不正确时,使用方法二:os.path.realpath(sys.argv[0])
        script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
    
        if FILE_PATH:
            # 拼接日志文件完整路径
            log_filename = os.path.join(script_dir, FILE_PATH, LOG_FILE_NAME)
            # 如果指定路径不存在,则尝试创建路径
            if not os.path.exists(os.path.join(script_dir, FILE_PATH)):
                os.makedirs(os.path.join(script_dir, FILE_PATH))
        else:
            # 拼接日志文件完整路径
            log_filename = os.path.join(script_dir, LOG_FILE_NAME)
    
        # 创建 Logger 实例,如果传入 logger_name 参数,则使用该名称创建 Logger,否则使用根 Logger
        logger = logging.getLogger(logger_name)
        logger.setLevel(WRITE_LEVEL)
    
        # 配置控制台输出
        console_handler = logging.StreamHandler()  # 创建 StreamHandler 实例,即将日志输出到控制台的处理器
        console_handler.setLevel(CONSOLE_LEVEL)
        console_handler.setFormatter(logging.Formatter(LOG_FORMAT))
        logger.addHandler(console_handler)
    
        # 配置文件输出
        file_handler = RotatingFileHandler(
            filename=log_filename,
            maxBytes=LOG_MAX_BYTES,
            backupCount=LOG_BACKUP_COUNT,
            encoding='utf-8'
        )  # 创建 RotatingFileHandler 实例,即将日志输出到文件的处理器
        file_handler.setLevel(FILE_LEVEL)
        file_handler.setFormatter(logging.Formatter(LOG_FORMAT))
        logger.addHandler(file_handler)
    
        return logger
    
    
    if __name__ == "__main__":
        logger = create_logger()
        logger.debug('debug message')
        logger.info('info message')
        logger.warning('warning message')
        logger.error('error message')
        logger.critical('critical message')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 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
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    二、按时间分割日志文件

    import logging
    import os
    import sys
    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
    WRITE_LEVEL = logging.DEBUG
    
    # 定义输出控制台日志级别
    CONSOLE_LEVEL = logging.INFO
    
    # 定义输出文件日志级别
    FILE_LEVEL = logging.ERROR
    
    # 日志文件存放路径,如不需要路径,填写 None
    FILE_PATH = "logs"
    
    # 日志文件名称
    LOG_FILE_NAME = "mylog.log"
    
    # 定义默认日志切割的时间单位,比如 'S'(秒)、'M'(分)、'H'(小时)、'D'(天)等
    WHEN = "H"
    
    # 定义默认日志文件切割的时间间隔,例如当 when='H' 且 interval=1 时,表示每隔一个小时进行一次切割,并生成一个新的日志文件
    INTERVAL = 1
    
    # 定义默认保留旧日志文件的个数(如果超过这个数量,则会自动删除最早的日志文件),默认值为 0,表示不自动删除旧日志文件
    BACKUPCOUNT = 0
    
    
    def create_logger(logger_name=None):
        """日志记录模块"""
        # 获取当前脚本所在的目录路径。该方法获取不正确时,使用方法二:os.path.realpath(sys.argv[0])
        script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
    
        if FILE_PATH:
            # 拼接日志文件完整路径
            log_filename = os.path.join(script_dir, FILE_PATH, LOG_FILE_NAME)
            # 如果指定路径不存在,则尝试创建路径
            if not os.path.exists(os.path.join(script_dir, FILE_PATH)):
                os.makedirs(os.path.join(script_dir, FILE_PATH))
        else:
            # 拼接日志文件完整路径
            log_filename = os.path.join(script_dir, LOG_FILE_NAME)
    
        # 创建 Logger 实例,如果传入 logger_name 参数,则使用该名称创建 Logger,否则使用根 Logger
        logger = logging.getLogger(logger_name)
        logger.setLevel(WRITE_LEVEL)
    
        # 配置控制台输出
        console_handler = logging.StreamHandler()  # 创建 StreamHandler 实例,即将日志输出到控制台的处理器
        console_handler.setLevel(CONSOLE_LEVEL)
        console_handler.setFormatter(logging.Formatter(LOG_FORMAT))
        logger.addHandler(console_handler)
    
        # 配置文件输出
        file_handler = TimedRotatingFileHandler(log_filename,
                                                when=WHEN,
                                                interval=INTERVAL,
                                                backupCount=BACKUPCOUNT,
                                                encoding='utf-8')  # 创建 TimedRotatingFileHandler 实例,即将日志输出到文件的处理器
        file_handler.setLevel(FILE_LEVEL)
        file_handler.setFormatter(logging.Formatter(LOG_FORMAT))
        logger.addHandler(file_handler)
    
        return logger
    
    
    if __name__ == "__main__":
        logger = create_logger()
        logger.debug('debug message')
        logger.info('info message')
        logger.warning('warning message')
        logger.error('error message')
        logger.critical('critical message')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 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
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
  • 相关阅读:
    Kafka 业务架构及消息丢失处理方案
    【建议背诵】软考高项考试案例简答题汇总~(7)
    百度echart的几种动画写法
    【无线传感器网络】2 STM32编程实验
    java游戏制作-拼图游戏
    Linux环境搭建
    大数据技术基础实验十三:Kafka实验——订阅推送示例
    【数据库SQL实战】获取所有部门当前manager的当前薪水情况
    C++内存管理(new和delete)
    【Java-LangChain:面向开发者的提示工程-8】聊天机器人
  • 原文地址:https://blog.csdn.net/qq_45664055/article/details/133792652