临时脚本里的一句 print 很方便,但当脚本开始反复运行,仅仅看到“执行结束”已经不够。需要知道它何时开始、处理了多少条记录、在哪一步停止,以及哪些结果需要人工查看。
日志围绕事件来写
一条日志最好表达一个明确事件,例如“输入文件读取完成”“跳过重复记录”或“目标文件已存在”。尽量带上可用于定位的任务编号、文件名和数量,但不要把整份敏感数据写进日志。
import logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
)
logger = logging.getLogger(__name__)
def inspect_rows(rows):
logger.info("开始检查,记录数=%s", len(rows))
missing = sum(not row.get("title") for row in rows)
logger.info("检查完成,缺少标题=%s", missing)
return missing等级表达处理的紧急程度
可以用 INFO 记录正常阶段,用 WARNING 记录可继续但值得关注的情况,用 ERROR 记录本次操作失败。等级应当服务于排查,避免所有消息都标成错误,也避免关键失败只出现在调试信息中。
异常需要上下文
捕获异常时,说明正在处理什么任务。在合适的异常处理块中使用 logger.exception,可以保留异常堆栈。不要为了让脚本“继续跑”而吞掉所有错误;无法保证结果正确时,应停止相关操作。
最后给出汇总
结束时记录成功、跳过和失败的数量,并保留失败项的定位方式。长时间运行的脚本还需要控制日志文件大小与保留期限。日志足够解释过程即可,没必要复制所有输入输出。