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)是目前最流行的组合。流程如下:

  1. Logstash:采集、解析、过滤日志。支持多种输入(file, syslog, tcp)和输出(ES)。
  2. Elasticsearch:全文检索、聚合分析。存储海量日志,秒级查询。
  3. Kibana:可视化、实时仪表盘。画趋势图、饼图很方便。

个人经验:我第一次搭ELK时,Logstash的grok正则写错,导致应用日志里 response_time=123ms 被解析成字符串。排查了半天才发现模式里漏了 %{NUMBER:response_time}。所以建议先用 grok debugger 在线测试。

下面这张图概括了日志分析的知识体系:

日志分析知识体系 日志分析知识体系 日志类型 系统日志 · 应用日志 安全日志 · 访问日志 Syslog / JSON / 自定义 日志格式 Syslog · Apache Combined JSON · CSV/TSV 解析规则决定提取效率 分析工具 grep · awk · sed Logstash · ES · Kibana 单机 → 集群 核心实践 时间同步 · 日志轮转 · 安全访问 · 实时告警 单机快速排查 grep + awk + less 集中式平台 ELK · Loki · Splunk 根据日志量级选择工具

3.4 日志分析最佳实践

  • 时间同步:服务器时间不对,日志就毫无价值。我吃过这个亏——A机10:00报错,B机09:55启动,排查了半天才发现是NTP没配。所有机器务必用NTP同步到同一时钟源。
  • 日志轮转:日志不轮转会撑爆磁盘,应用直接挂。用 logrotate 设置按天或按大小压缩,保留30天。
  • 安全考虑:日志里可能会记录用户密码、。我建议在采集或存储时做脱敏处理。ELK里可以用Logstash的filter {} 用正则替换掉敏感字段。
  • 分级告警:别啥都告警。ERROR级别才发钉钉,WARNING可以汇总日报,INFO直接归档。否则告警疲劳让你错过真正的问题。

总结一句:日志分析没有银弹。小问题grep+awk秒杀,大规模场景上ELK。关键是你要了解日志的格式和业务含义——工具只是辅助,脑子里的分析模型才是核心。