📖 知识点简介
日志是运维排查第一利器。系统运行中的报错、异常、入侵痕迹都会在日志中留下蛛丝马迹。Linux 日志体系以 rsyslog/systemd-journald 为核心,journalctl 是 systemd 生态下的统一日志查询利器。本篇聚焦日志采集、查询与常见排查场景。
🧰 核心命令整理
1. 系统日志架构
| 文件路径 | 说明 |
|---|---|
/var/log/messages |
通用系统日志(CentOS 6/RHEL) |
/var/log/syslog |
通用系统日志(Debian/Ubuntu) |
/var/log/secure |
认证与安全日志(ssh 登录等) |
/var/log/maillog |
邮件服务日志 |
/var/log/cron |
定时任务日志 |
/var/log/boot.log |
系统启动日志 |
/var/log/dmesg |
内核环缓冲日志 |
/var/log/nginx/access.log |
Nginx 访问日志(按服务) |
2. journalctl --- 新时代日志王牌
bash
# 查看所有日志(默认只保留最近几次启动的)
journalctl
# 仅查看本次启动的日志(排查重启问题神器)
journalctl -b
journalctl -b -1 # 上一次启动
journalctl -b -2 # 上上次启动
# 按时间过滤
journalctl --since "2026-06-17 00:00:00"
journalctl --since "1 hour ago"
journalctl --until "2026-06-17 08:00:00"
# 按服务/单元过滤
journalctl -u nginx.service
journalctl -u sshd.service --since "30 min ago"
# 按优先级过滤(0=emerg, 1=alert, 2=crit, 3=err, 4=warning...)
journalctl -p err -b # 本次启动的所有错误级日志
journalctl -p 3..0 # err 及以上
# 实时追踪(类似 tail -f)
journalctl -f
journalctl -u nginx.service -f
# 简笔输出(去掉元数据,只看消息体)
journalctl -xe -u sshd.service | tail -20
# 查看内核日志(替代 dmesg)
journalctl -k
journalctl -k -b
3. 传统日志查看三板斧
bash
# 实时滚动
tail -f /var/log/messages
# 只看最后 N 行
tail -100 /var/log/secure
# 翻页查看
less /var/log/maillog
# 搜索关键词
grep -i "error|failed|denied" /var/log/syslog
# 查看连接失败的 SSH 爆破 ip
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr
🔧 实操示例
场景一:服务器突然响应慢,排查根因
bash
# ① 先看系统资源
top -bn1 | head -5
free -h
df -h
# ② 查看最近 30 分钟的错误日志
journalctl -p err --since "30 min ago" --no-pager
# ③ 检查是否有 OOM(内存不足杀进程)
journalctl -k | grep -i "oom|out of memory"
# ④ 检查磁盘 I/O 是否异常
iostat -x 1 3
场景二:SSH 登录失败排查
bash
# 查看最近失败的登录尝试
journalctl -u sshd.service -p err --since "1 hour ago"
# 或传统方式
grep "Failed password" /var/log/secure | tail -20
# 统计爆破来源 IP
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -10
场景三:Nginx 502 网关超时排查
bash
# 查看 Nginx 错误日志
tail -100 /var/log/nginx/error.log
# 同时查看后端 PHP-FPM/Java 日志
journalctl -u php-fpm.service --since "10 min ago"
journalctl -u tomcat.service --since "10 min ago"
# 关联时间戳比对,定位耗时环节
⚠️ 常见坑点/注意事项
-
journalctl 日志默认不持久化 --- 重启后系统只保留最近几次启动的日志。需要长期归档则在
/etc/systemd/journald.conf中设置Storage=persistent。 -
日志轮转别忽视 --- 日志文件会一直增长撑爆磁盘:
bash# 配置 logrotate cat /etc/logrotate.d/nginx -
时区问题 --- 日志时间默认 UTC,如需转成本地时间查看比较,用
journalctl时可带--utc确认时间戳。 -
日志过于冗长时 --- 优先用
-p err+-u 服务名缩小范围,不要上来就grep /var/log/messages。 -
不要忽略 boot 日志 --- 服务器非正常重启,一定用
journalctl -b -1查看上一次启动日志,往往藏着宕机线索。 -
日志删除需注意 --- 不要直接
rm正在被进程写入的日志文件,会导致句柄残留不释放磁盘。推荐用> /var/log/messages清空或通过 logrotate 轮转。
📌 一句话总结:遇到问题先看日志 → journalctl -p err -b 三步快筛;日志持久化要配好,别等宕机才后悔没存档。