在生产环境中,绝大多数故障的第一现场不在监控图表,而在日志文件。日志是系统行为的"原始记录"。Shell 的优势不在于炫技,而在于对文本数据的高速处理能力。在 Linux 体系中,日志分析几乎天然就是 Shell 的主场。
一、日志体系的基本认知
在主流 Linux 发行版(如 CentOS、Ubuntu)中,日志通常集中在 /var/log 目录下。现代系统多采用 systemd 体系,其日志管理核心是 journald。传统系统中常见的是 rsyslog。
常见日志类型包括:
-
系统日志:messages、syslog
-
认证日志:secure、auth.log
-
内核日志:dmesg
-
Web 服务日志:如 Nginx、Apache HTTP Server
-
数据库日志:如 MySQL
理解日志来源,是写好日志分析脚本的第一步。脚本不是目的,定位问题才是。
二、日志分析的运维思维
日志分析可以抽象为四个问题:
-
什么时候出问题?
-
谁在出问题?
-
出现了什么异常行为?
-
是否具有持续性或规律性?
Shell 的价值在于快速回答这四个问题。
例如,当 Web 访问异常升高时,我们关注:
-
某时间段的访问量
-
是否存在异常状态码(500、502)
-
是否有异常 IP 高频访问
-
是否存在特定攻击特征
核心工具往往只有 grep、awk、sed、sort、uniq、cut。
三、典型场景一:高并发访问分析
以 Nginx 访问日志为例,目标是找出访问次数最多的 IP。
思路:
-
取出 IP 列
-
统计频次
-
排序输出
示例逻辑:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
这类命令在百万行日志中依然高效。相比手工翻日志,这是数量级的效率提升。
运维价值在于:当业务被攻击时,你可以在几十秒内给出高频来源列表,而不是"正在排查中"。
四、典型场景二:错误日志趋势分析
例如统计 500 错误在每分钟的分布情况。
思路:
-
过滤 500 状态码
-
提取时间字段
-
按分钟聚合统计
这类统计可以快速判断:
是瞬时峰值?
还是持续性异常?
是否与发布窗口时间重合?
Shell 在文本聚合方面的优势非常明显。
五、典型场景三:自动化报警脚本
真正的运维价值不在于"会分析",而在于"自动发现"。
一个基础的日志监控脚本逻辑:
-
定时扫描最近 5 分钟日志
-
统计错误数量
-
超过阈值则发送告警
告警方式可以是:
邮件
企业微信 webhook
短信接口
Shell 本身可以通过 curl 直接对接 webhook API,实现自动告警闭环。
这类脚本在小型团队中非常常见,成本极低,但价值极高。
六、日志轮转与性能问题
很多初学者忽略一个问题:日志文件是不断增长的。
日志管理涉及到:
-
日志轮转机制
-
历史日志归档
-
压缩与清理
Linux 中常见工具是 logrotate。
如果脚本直接处理一个 20GB 的日志文件,效率会显著下降。因此生产环境应:
-
分文件处理
-
使用管道流式分析
-
避免无意义的全量扫描