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