解析 Linux 日志的关键在于先判断日志来源和格式类型,再选择合适的方法。下面按常见日志类型、格式说明和解析方式系统讲解。
/var/log/messages(RHEL/CentOS)/var/log/syslog(Debian/Ubuntu)典型格式:
Jun 18 10:23:01 hostname sshd[1234]: Failed password for root from 192.168.1.10 port 22 ssh2
字段含义:
时间 主机名 服务[进程ID]: 日志内容
journalctl 查看journalctl
journalctl -u sshd
journalctl --since "2025-01-01" --until "2025-01-02"
输出示例:
Jan 01 10:00:01 host sshd[1234]: Accepted password for user from 10.0.0.1 port 22
/var/log/nginx/access.log/var/log/httpd/access_log/var/log/mysql/error.logNginx access 日志:
127.0.0.1 - - [18/Jun/2025:10:00:00 +0800] "GET /index.html HTTP/1.1" 200 1024
awk(最常用)grep "Failed password" /var/log/secure
awk '/Failed password/ {print $(NF-3)}' /var/log/secure
awk '{print $1, $2, $3, $5}' /var/log/messages
sed / grepgrep "error" /var/log/messages
grep -i "fail" /var/log/syslog
journalctl JSON 输出(推荐)journalctl -o json
journalctl -o json-pretty
解析 JSON 示例(jq):
journalctl -o json | jq '.MESSAGE'
import re
pattern = r'(?P<date>\w+\s+\d+\s+\d+:\d+:\d+)\s+(?P<host>\S+)\s+(?P<service>\S+):\s+(?P<msg>.*)'
with open('/var/log/messages') as f:
for line in f:
m = re.match(pattern, line)
if m:
print(m.groupdict())
{"time":"2025-06-18T10:00:00Z","level":"ERROR","msg":"db connect failed"}
解析:
jq '.msg' app.log
module(load="mmjsonparse")
action(type="omfile" file="/var/log/app.json")
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
| 工具 | 用途 |
|---|---|
| awk / sed / grep | 快速解析 |
| jq | JSON 日志 |
| journalctl | systemd 日志 |
| Python / Go | 复杂解析 |
| ELK / Loki | 大规模日志分析 |
✅ 先确认日志格式(syslog / json / 自定义)
✅ 能用 journalctl 就别直接读文件
✅ 生产环境建议日志结构化(JSON)
✅ 大文件避免 cat,用 awk / grep
如果你有具体日志样例(比如 SSH、Nginx、Docker、K8s 日志),可以直接贴出来,我可以帮你写精准解析规则。