3、日志分析入门:日志类型、日志格式、常用分析工具
日志这东西,说简单也简单,说复杂能让你抓狂。我干了十几年运维,见过太多因为日志没看清导致故障持续数小时的案例。其实日志就是系统的“黑匣子”,你读懂它,就能还原事故现场。这一节咱们把日志分析的基础打牢——从日志长什么样,到用什么工具扒开它。
3.1 日志类型
按来源分,日志大致有四类:
| 类型 | 典型来源 | 代表内容 |
|---|---|---|
| 系统日志 | /var/log/messages, syslog, dmesg | 内核消息、硬件故障、服务启停 |
| 应用日志 | Tomcat catalina.out, Nginx access.log, Java stacktrace | 业务异常、性能指标、用户行为 |
| 安全日志 | /var/log/secure, audit.log, auth.log | 登录失败、权限提升、防火墙阻断 |
| 访问日志 | Web服务器access log, CDN日志 | IP、URL、响应码、User-Agent |
我个人习惯把安全日志和应用日志放在一起看。有一次线上被扫,光看access.log只能看到一堆404,但结合secure日志发现暴力破解SSH的IP和扫描的IP一致——锁定攻击者就快了。
3.2 日志格式
日志的格式决定了你怎么解析它。常见的几种:
- Syslog格式:时间 主机 进程[PID]: 消息。
Mar 24 10:15:30 web01 sshd[1234]: Failed password for root from 10.0.0.5 port 22 - Apache Combined格式:IP - 用户 [时间] "请求" 状态码 字节 "Referer" "UA"。
192.168.1.1 - - [24/Mar/2025:10:15:30 +0800] "GET /index.php HTTP/1.1" 200 1234 "-" "Mozilla/5.0" - JSON格式:现代应用常用,解析方便。
{"timestamp":"2025-03-24T10:15:30Z","level":"ERROR","logger":"com.example","message":"DB connection timeout"} - CSV/ TSV:简单的列分隔,适合awk直接切。
小提示:我遇到过一个坑——日志里混了不可见字符。用
cat -A logfile 能看到 ^M(回车符),这种文件用awk切字段容易错。先 dos2unix 转一下。3.3 常用分析工具
3.3.1 grep:文本搜索利器
grep 是我最常用的“急诊”工具。出故障时,第一反应就是 grep -i "error" /var/log/app.log | tail -100。几个关键用法:
-E:扩展正则,比如grep -E "ERROR|FATAL"一次匹配多个关键词。-v:排除干扰行,比如grep -v "DEBUG"只看关键日志。-B 5 -A 10:显示匹配行的前后5行和10行,还原上下文。
记得有一次,一个Java应用OOM,日志里只出现一次 OutOfMemoryError,周围全是正常日志。我用 grep -B 20 -A 5 才看到OOM前有几行GC异常,这才定位到堆配置问题。
注意:grep 遇到二进制文件(比如zip日志)会自动输出“Binary file matches”。用
-a 强制当文本处理,但小心乱码。3.3.2 awk:结构化文本处理
awk 是处理“有规律”日志的神器。我经常用它统计访问量、提取特定字段。比如Apache access log里统计每个IP的请求次数:
awk '{print $1}' /var/log/httpd/access.log | sort | uniq -c | sort -rn | head -10
解释一下:$1是第一个字段(IP),然后排序、去重计数、再排序取前10。如果你要统计状态码分布,改成 print $9 就行。
更复杂的场景,比如从JSON日志里提取字段——虽然awk不直接支持JSON,但可以搭配 grep -oP 或者用 jq。不过真要复杂解析,建议上ELK。
3.3.3 ELK Stack:集中式日志平台
当服务器多了,grep和awk就力不从心了。ELK(Elasticsearch, Logstash, Kibana)是目前最流行的组合。流程如下:
- Logstash:采集、解析、过滤日志。支持多种输入(file, syslog, tcp)和输出(ES)。
- Elasticsearch:全文检索、聚合分析。存储海量日志,秒级查询。
- Kibana:可视化、实时仪表盘。画趋势图、饼图很方便。
个人经验:我第一次搭ELK时,Logstash的grok正则写错,导致应用日志里
response_time=123ms 被解析成字符串。排查了半天才发现模式里漏了 %{NUMBER:response_time}。所以建议先用 grok debugger 在线测试。下面这张图概括了日志分析的知识体系:
3.4 日志分析最佳实践
- 时间同步:服务器时间不对,日志就毫无价值。我吃过这个亏——A机10:00报错,B机09:55启动,排查了半天才发现是NTP没配。所有机器务必用NTP同步到同一时钟源。
- 日志轮转:日志不轮转会撑爆磁盘,应用直接挂。用
logrotate设置按天或按大小压缩,保留30天。 - 安全考虑:日志里可能会记录用户密码、。我建议在采集或存储时做脱敏处理。ELK里可以用Logstash的filter {} 用正则替换掉敏感字段。
- 分级告警:别啥都告警。ERROR级别才发钉钉,WARNING可以汇总日报,INFO直接归档。否则告警疲劳让你错过真正的问题。
总结一句:日志分析没有银弹。小问题grep+awk秒杀,大规模场景上ELK。关键是你要了解日志的格式和业务含义——工具只是辅助,脑子里的分析模型才是核心。