Python入门:用20行代码写一个可复用的日志小工具
新手写 Python 时,经常在各处使用 print 来查看运行状态。项目变大后,这些零散输出会混在一起,既找不到关键信息,也很难区分普通提示和真正错误。一个只有二十行左右的日志小工具,就能解决这个问题。它不依赖任何第三方库,只用标准库,就能让输出统一、有时间、有级别。
为什么要统一日志
首先,统一格式能让阅读成本大幅下降。时间、级别和内容固定出现在同一位置,扫一眼就能判断这条信息是否需要处理。其次,级别能帮助筛选信息。调试时看详细内容,上线后只看警告和错误,切换时不需要改业务代码。最后,集中管理输出位置也很重要。以后想把日志写到文件,或者同时输出到屏幕和文件,只改一处即可。
核心思路只有三点
第一,用一个函数创建并返回记录器,避免在每个文件里重复配置。第二,根据模块名称区分来源,这样出现问题时可以快速定位到具体文件。第三,用级别控制输出范围,让调试信息和正式信息互不干扰。这三点听起来简单,但在实际项目中非常实用,也是很多成熟工具的基本做法。
示例代码
import logging
def get_logger(name):
logger = logging.getLogger(name)
if logger.handlers:
return logger
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(name)s %(message)s", datefmt="%H:%M:%S"))
logger.addHandler(handler)
logger.propagate = False
return logger
log = get_logger("demo")
log.info("任务开始")
log.warning("配置缺失,使用默认值")
代码逐段说明
创建记录器时先检查是否已有处理器,这是为了防止重复添加导致同一条日志打印多次。把级别设为调试级别,意味着更详细的信息也会保留,之后可以通过处理器或环境来收紧范围。格式化字符串中的时间、级别、名称和消息,分别对应排查时最常问的四个问题:什么时候发生、严重程度如何、来自哪里、具体是什么事。关闭向上传播,是为了避免同一条日志在父记录器里再出现一次。
日常使用方式
在程序入口创建一次记录器并传入模块名,其它函数直接使用它即可。正常流程用提示级别记录关键节点,例如任务开始、任务完成和处理条数。遇到可以继续但值得注意的情况,用警告级别,例如配置缺失、重试一次或使用默认值。遇到无法继续的情况,用错误级别,并尽量写清楚失败原因和已经尝试过的处理方式。坚持这种区分,日志读起来会像一份简洁的运行报告。
容易踩的坑
第一,不要在循环里反复创建处理器,否则日志会成倍出现。第二,不要把密码、密钥和用户隐私写进日志,即使只是调试时临时打印,也要在提交前删掉。第三,日志不是越详细越好,循环内部的高频输出会淹没真正重要的信息,关键节点记录一次就够了。第四,时间格式尽量简洁,日常排查用时分秒已经足够。
小结
一个好的日志习惯,不在于工具多复杂,而在于格式统一、级别清晰、来源可查。先从这个二十行的小工具开始,把它用到自己的练习项目里,再根据需要扩展到文件输出和按级别过滤,你会发现排查问题的时间明显减少,代码也更容易维护。
- 点赞
- 收藏
- 关注作者
评论(0)