写脚本时遇到问题,总不能靠 print 一句句硬猜吧?比如你写的爬虫半夜挂了,或者后台服务突然不响应,又没留下任何线索——这时候,日志就是你的“黑匣子”。
不用装包,标准库自带 logging
Python 安装好就自带 logging 模块,不用 pip install,不用额外配置,打开编辑器就能用。它比 print 强在哪?能分等级(DEBUG、INFO、WARNING、ERROR)、能写进文件、能自动加时间戳,还能按大小轮转日志——这些都不是幻想,是开箱即用的功能。
最简起步:三行打出带时间的 INFO 日志
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info('程序启动成功')运行后你会看到类似:2024-06-12 10:23:45,123 - INFO - 程序启动成功
时间、级别、消息全齐,一眼就清楚发生了什么。
实际场景:把错误稳稳记进文件
假设你有个自动备份脚本,每次执行完要记录结果,出错了更要留证据。这么写:
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('backup.log', encoding='utf-8'),
logging.StreamHandler() # 同时输出到控制台
]
)
logger = logging.getLogger('backup')
try:
# 模拟备份操作
with open('/path/to/source.txt') as f:
content = f.read()
logger.info(f'读取成功,共 {len(content)} 字符')
except FileNotFoundError:
logger.error('源文件不存在,请检查路径')
except Exception as e:
logger.exception('未预期错误') # 自动记录异常堆栈运行后,控制台能看到实时输出,同时所有记录都存进 backup.log 里,下次排查直接翻文件就行,不怕命令行历史被清空。
小技巧:按天或按大小自动切日志
长期运行的服务,日志容易越积越多。用 RotatingFileHandler 或 TimedRotatingFileHandler 就能自动归档:
from logging.handlers import TimedRotatingFileHandler
handler = TimedRotatingFileHandler(
'app.log',
when='midnight', # 每天零点切割
interval=1,
backupCount=7 # 只保留最近 7 天
)
handler.setFormatter(logging.Formatter('%(asctime)s - %(message)s'))
logger = logging.getLogger('myapp')
logger.addHandler(handler)
logger.setLevel(logging.INFO)这样每天都会生成 app.log.2024-06-12、app.log.2024-06-13……老的日志自动删掉,再也不用手动清理。
别再用 print 调试了
print 是临时拐杖,logging 是真工具。改两行代码,就能让脚本从“跑起来就行”变成“出了事也能快速定位”。尤其在服务器上跑的 Python 小工具、自动化任务、定时脚本——加个日志,等于给自己配了个值班记录本。