1、日志记录器logging
在python中,通常使用logging模块管理日志信息。首先,创建logger日志记录器,主要负责生成日志消息。
import logging
import re
from logging.handlers import TimedRotatingFileHandler
# 创建日志记录器,传入日志文件名字
logger = logging.getLogger(log_name)
# 创建日志文件的保存目录
log_dir = "./logs"
log_path= os.path.join(log_dir,log_name)
if not os.path.exists(log_dir'):
os.makedirs(log_dir")
# 设置日志级别,如DEBUG、INFO、WARNING、ERROR 和 CRITICAL。
logger.setLevel(logging.INFO)
2、日志管理器Handlers
在logging模块中,handlers 是日志记录管理中的一个常用工具,负责将日志消息输出到不同的目标,如控制台、文件、网络等。
常见的处理器包括 StreamHandler(输出到控制台)和 HTTPHandler(发送到 Web 服务器)等。其中,TimedRotatingFileHandler处理器可以帮助你管理日志大小,生成和删除,主要包含以下两部分功能,
- 时间间隔轮换: 按照设定的时间间隔自动创建新的日志文件。
- 备份文件数量: 保留指定数量的旧日志文件,删除超出的文件。
from logging.handlers import TimedRotatingFileHandler
# 创建日志管理器
file_handler = TimedRotatingFileHandler(
filename=log_path, when="MIDNIGHT",
interval=1, backupCount=30
)
# filename 要写入的日志文件路径
# when 指定轮换的时间间隔单位。可以是以下值之一:
'S':秒
'M':分钟
'H':小时
'D':天
'W0' 到 'W6':每周的特定一天(0代表星期一,6代表星期日)
'midnight':午夜(即每天的00:00)
# interval 指定轮换的时间间隔数,和when 参数一起使用:
例如,如果 when='H'和 interval=1,日志文件每小时轮换一次。
# backupCount 保留的旧日志文件数量
# 设置保留的旧日志文件名字格式,如log_name.2024-12-09.log
file_handler.suffix = "%Y-%m-%d.log"
# 添加日志管理器到日志记录器
logger.addHandler(file_handler)
# 正则表达式,用于匹配日志文件名后; 需要注意的是suffix和extMatch一定要匹配上,如果不匹配,过期日志不会被删除。
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$")
3、日志格式化器Formatter
logging通过 logging.Formatter 设置格式化器,定义日志消息的格式,通常包括时间、日志级别、消息等。
# 设置日志格式,创建格式化器
formatter = logging.Formatter(
"[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s"
)
)
# 其中,参数详解,主要用来定位问题:
# %(asctime)s,日志记录时间的字符串表示。
# %(process)d,日志记录时的进程ID(PID)。
# %(levelname)s,日志的级别名称,如DEBUG、INFO、WARNING、ERROR等。
# %(module)s,日志记录来自的模块名,不包括文件扩展名。
# %(funcName)s,日志记录时的函数名。
# %(filename)s,日志记录所在的文件名,包括文件扩展名。
# %(lineno)d,日志记录所在的行号,是一个整数。
# %(message)s,日志记录的实际消息内容。
# 将格式化器添加到日志处理器中
file_handler.setFormatter(formatter)
4、日志记录
初始化日志记录器,管理器和格式化器后,就可直接在你的核心代码中添加任何你想记录的信息。比较常见的日志级别:
- logger.info(‘This is an infomessage’)
- logger.warning(‘This is a warning message’)
- logger.error(‘This is an error message’)
- logger.critical(‘This is a critical message’)
- logger.debug(‘This is a debug message’)
完整代码,包含日志记录器,管理器,格式化器
import logging
import re
from logging.handlers import TimedRotatingFileHandler
# 创建日志记录器,传入日志文件名字
logger = logging.getLogger(log_name)
# 创建日志文件的保存目录
log_dir = "./logs"
log_path= os.path.join(log_dir,log_name)
if not os.path.exists(log_dir'):
os.makedirs(log_dir")
# 设置日志级别INFO
logger.setLevel(logging.INFO)
# 创建日志文件管理器
file_handler = TimedRotatingFileHandler(
filename=log_path, when="MIDNIGHT", interval=1, backupCount=30
)
# 设置保留的旧日志文件名字格式,如log_name.2024-12-09.log
file_handler.suffix = "%Y-%m-%d.log"
# 正则表达式,用于匹配日志文件名后; 需要注意的是suffix和extMatch一定要匹配上,如果不匹配,过期日志不会被删除。
file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}.log$")
# 定义日志输出格式
file_handler.setFormatter(
logging.Formatter(
"[%(asctime)s] [%(process)d] [%(levelname)s] - %(module)s.%(funcName)s (%(filename)s:%(lineno)d) - %(message)s"
)
)
# 将日志管理器添加到日志记录器
logger.addHandler(file_handler)