前言

  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')

二、按时间分割日志文件

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')
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐