本节内容主要介绍日志系统,并设计一个实用模板,随时供其他python程序调用,告别使用print的模式。
1. 日志基本介绍
在现代软件开发中,日志系统扮演着至关重要的角色。它不仅是排查问题的“显微镜”,更是系统运行的“黑匣子”。根据Stack Overflow 2024开发者调查,超过89%的开发者认为日志是日常开发中最常用的调试工具。
日志(Logging)是一种记录软件运行状态的机制,通过在代码关键位置插入日志语句,可以实时追踪程序执行流程。Python内置的logging模块提供了完整的日志解决方案,支持从简单输出到复杂结构化日志的全场景需求。日志系统的核心组件包括:
(1)Logger:日志记录器,应用代码直接调用的接口
(2)Handler:输出渠道,支持控制台、文件、邮件等
(3)Formatter:日志格式定义,支持时间、级别、代码位置等元数据,可以显示文件名称及报错的具体位置。
(4)Filter:日志过滤规则,实现选择性记录
2. 日志的核心作用
2.1. 调试利器
当程序出现非预期行为时,通过日志可以快速定位问题发生的上下文。例如:
def divide(a, b):
logger.debug(f"divide({a}, {b}) called")
if b == 0:
logger.error("Divide by zero error")
raise ValueError
return a / b
2.2. 运行监控
在生产环境中,日志可用于监控系统负载和资源使用情况:
logger.info(f"Processed {request_count} requests in {elapsed_time}s")
2.3. 安全监测
关键操作记录是系统安全的重要防线:
logger.warning(f"User {user_id} attempted login with incorrect password")
2.4. 性能分析
通过日志统计各模块执行时间:
start_time = time.time()
# ...业务逻辑...
logger.debug(f"Module A execution time: {time.time()-start_time:.2f}s")
3 实用模板
下面将通过一个增强型日志模块示例,演示如何构建功能完备的日志系统。完整代码如下。我们只需要将下面内容保存为python文件后直接调用。
3.1. 模板源码
import logging
from colorama import Fore, Style, init
# 初始化 colorama,确保 Windows 终端支持 ANSI 转义序列
init(autoreset=True)
# 定义颜色代码
class ColoredFormatter(logging.Formatter):
# 使用 colorama 提供的颜色
COLOR_CODES = {
'DEBUG': Fore.BLUE, # 蓝色
'INFO': Fore.GREEN, # 绿色
'WARNING': Fore.YELLOW, # 黄色
'ERROR': Fore.RED, # 红色
'CRITICAL': Fore.MAGENTA, # 紫红色
}
def format(self, record):
# 获取日志级别的颜色
log_color = self.COLOR_CODES.get(record.levelname, '')
# 格式化消息并添加颜色
log_message = super().format(record)
return f"{log_color}{log_message}{Style.RESET_ALL}"
def get_logger(filename='', mode='w'):
# 创建日志器
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 定义控制台日志格式
console_formatter = ColoredFormatter('%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s')
console_handler.setFormatter(console_formatter)
# 添加处理器到日志器
logger.addHandler(console_handler)
if len(filename) > 0:
# 创建文件处理器
file_handler = logging.FileHandler(filename, encoding='utf-8', mode=mode)
file_handler.setLevel(logging.DEBUG)
# 定义文件日志格式(不带颜色)
file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - [%(filename)s:%(lineno)d] - %(message)s')
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
return logger
if __name__ == '__main__':
logger = get_logger('app.log', 'a')
# 测试日志
logger.debug('这是调试消息')
logger.info('这是信息消息')
logger.warning('这是警告消息')
logger.error('这是错误消息')
logger.critical('这是严重错误消息')
3.2. 调用示例
假设上面程序已保存为logs.py文件,那么调用方法如下:
from logg import get_logger # 假设保存为logg.py
# 初始化日志器
logger = get_logger('app.log', 'a')
# 记录不同级别的日志
logger.debug('调试信息')
logger.info('普通信息')
logger.warning('警告信息')
logger.error('错误信息')
logger.critical('严重错误')
4. 输出效果
在日志配置中,setLevel 方法用于设置日志器(Logger)或处理器(Handler)的最低日志级别,只有高于或等于该级别的日志才会被记录。例如:
logger.setLevel(logging.DEBUG) # 记录所有级别的日志
console_handler.setLevel(logging.WARNING) # 控制台仅输出 WARNING 及以上级别的日志
(1)Python 的日志级别从低到高依次为:
(2)DEBUG:详细的调试信息,通常用于开发阶段
(3)INFO:一般运行信息,例如程序启动或配置加载
(4)WARNING:警告信息,表明可能存在问题,但程序仍能继续运行
(5)ERROR:错误信息,表示程序遇到问题,需要修复
(6)CRITICAL:严重错误,可能导致程序崩溃
在实际项目中,合理设置日志级别可以避免记录过多无用日志,提高程序运行效率,同时确保关键日志信息不会被忽略。例如,在开发环境可以设置DEBUG级别以获取详细信息,而在生产环境通常使用WARNING或更高级别,以减少日志量,提高可读性。
4.1. 控制台输出效果
运行后控制台将显示带颜色的日志:
4.2. 文件日志内容
如果调用时日志文件名为空,那么将不输出日志到文件。模式为w表示每次运行程序将重新创建日志文件。模式为a表示每次运行日志将追加到当前日志文件内。
app.log日志文件内容如下图所示。
通过本文的介绍,我们学习了Python日志系统的基本概念、核心作用,并提供了一个增强型日志模块模板,方便在实际开发中直接使用。一个良好的日志系统不仅能帮助开发者高效调试,还能在生产环境中提供关键的运行监控和安全保障。
建议在实际项目中,根据具体需求调整日志级别、存储方式以及格式,确保日志既能完整记录关键信息,又不会影响程序性能。希望本文提供的模板能助你快速构建稳定可靠的日志系统,为你的Python开发工作带来更高效的调试体验。
更多 Python 与 C++ 技巧、AI 大模型、计算机视觉基础到实践、三维算法、深度学习算法等完整指南与总结分享,欢迎关注我的博客:https://blog.youkuaiyun.com/suiyingy,或公众号“乐乐感知学堂”。此外,推荐专业书籍《人工智能点云处理及深度学习算法》,助你深入探索 Python 在三维领域的应用,期待交流与讨论!