1. 日志基础概念
刚入行那会儿,我其实对日志挺不屑的。感觉不就是打印点消息嘛,谁不会啊。直到有一次线上服务挂了,我翻着控制台一堆乱码,完全不知道从哪查起……嗯,从那以后,我才真正意识到日志这东西,说白了就是系统的“黑匣子”。
日志到底用来干嘛?
日志的作用,我总结下来就三件事:
- 排错定位:代码崩了,先看日志。哪行报错、什么参数、堆栈信息,一目了然。
- 监控告警:程序跑得稳不稳,业务量涨没涨,日志能告诉你实时状态。
- 审计追溯:出事故了,谁操作了什么、什么时间、结果如何,日志就是铁证。
日志级别——你得知道哪个该打、哪个不该打
日志级别就像天气预报的预警信号。级别不同,含义和紧急程度完全不一样。我见过不少新手所有日志都用 print(),结果生产环境刷屏刷到机器报警。来,看一下标准的 Python 日志级别:
| 级别 | 数值 | 什么时候用 |
|---|---|---|
| DEBUG | 10 | 调试信息,开发环境用,生产环境通常关掉 |
| INFO | 20 | 程序正常运行的状态信息,比如“用户登录成功” |
| WARNING | 30 | 有问题但还能跑,比如“磁盘空间不足 80%” |
| ERROR | 40 | 功能受损,比如“数据库连接失败” |
| CRITICAL | 50 | 整个系统要崩了,需要人工立即介入 |
logger.debug() 写成了 logger.info(),结果在线上每天刷出几百万条调试日志,磁盘直接打满。生产环境一定要控制好日志级别啊!
为什么要分级别?你想想看,如果所有信息都输出,排查问题时反而找不到重点。级别就是过滤器,让你只看到当前关心的信息。
日志格式——信息得有规矩
日志不是随便写个字符串就完事了。好的日志格式能帮你快速定位问题。
# 一个典型的 Python 日志格式
2025-09-15 10:23:45,123 - myapp - INFO - 用户 9527 登录成功 [request_id: abc123]
一般包含这几部分:
- 时间戳:精确到毫秒,方便排序和对齐
- 模块名:知道是哪段代码打出来的
- 级别:一目了然严重程度
- 消息正文:核心信息
- 上下文:比如请求ID、用户ID、调用链ID
我个人习惯在日志里加上 request_id。这样即使并发请求乱飞,也能把同一用户的日志串起来。这个技巧在我们后续的关键字匹配中会非常有用。
常见日志系统简介
说到日志系统,光靠 Python 自带的 logging 模块,在小项目里够用。但一旦上了规模,就需要专门的日志系统来收集、存储、查询。这里简单介绍几个我工作中用过的:
| 系统 | 特点 | 适用场景 |
|---|---|---|
| Python logging | 内置模块,零依赖,配置简单 | 单体应用、脚本、小项目 |
| ELK (Elasticsearch + Logstash + Kibana) | 全文搜索、可视化、集群扩展强 | 分布式系统、微服务、大数据量 |
| Grafana Loki | 轻量级,与 Prometheus 生态结合好 | 云原生、K8s 环境 |
| Splunk | 商业化,搜索性能强,但贵 | 金融、大型企业 |
说到底,日志系统的核心就三个动作:产生(应用打日志)、传输(网络或文件)、存储查询(数据库或搜索引擎)。本章我们先打好基础,后面一步步实战。
为了把本章的知识点串起来,我画了一张框架图,你看完之后应该能对整个日志体系有个整体感觉。
这张图把本章的四个核心块串在一起了:日志作用、日志级别、日志格式、常见日志系统。你可以看到,所有知识都围绕着“日志基础概念”这个根节点展开。记住这个结构,后续学关键字匹配时,你会知道每一步的信息从哪里来、往哪里写。
嗯,基础概念我们就聊到这儿。别小看这些,很多线上事故排查最终都归结到“日志级别打错了”或者“格式里漏了关键信息”。打好这个底,后面实战才会顺手。