日志管理与排查 — journalctl & 系统日志实战

📖 知识点简介

日志是运维排查第一利器。系统运行中的报错、异常、入侵痕迹都会在日志中留下蛛丝马迹。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"

# 关联时间戳比对,定位耗时环节

⚠️ 常见坑点/注意事项

  1. journalctl 日志默认不持久化 --- 重启后系统只保留最近几次启动的日志。需要长期归档则在 /etc/systemd/journald.conf 中设置 Storage=persistent

  2. 日志轮转别忽视 --- 日志文件会一直增长撑爆磁盘:

    bash 复制代码
    # 配置 logrotate
    cat /etc/logrotate.d/nginx
  3. 时区问题 --- 日志时间默认 UTC,如需转成本地时间查看比较,用 journalctl 时可带 --utc 确认时间戳。

  4. 日志过于冗长时 --- 优先用 -p err + -u 服务名 缩小范围,不要上来就 grep /var/log/messages

  5. 不要忽略 boot 日志 --- 服务器非正常重启,一定用 journalctl -b -1 查看上一次启动日志,往往藏着宕机线索。

  6. 日志删除需注意 --- 不要直接 rm 正在被进程写入的日志文件,会导致句柄残留不释放磁盘。推荐用 > /var/log/messages 清空或通过 logrotate 轮转。

📌 一句话总结:遇到问题先看日志 → journalctl -p err -b 三步快筛;日志持久化要配好,别等宕机才后悔没存档。

相关推荐
神奇小汤圆24 分钟前
牛客网Java八股文|2026秋招面试题汇总(金九银十冲刺专用)
后端
cfm_291429 分钟前
SpringBoot MockMvc
spring boot·后端·log4j
神奇小汤圆39 分钟前
你的Java天花板,不是Spring Boot,是思维方式
后端
梨子同志39 分钟前
Maven
后端
用户416596736935541 分钟前
堡垒机 Web CLI 部署教程
后端
xiyueyezibile1 小时前
“自迭代” Skill 的 team-pitfalls 的演进
前端·后端·ai编程
叫我少年1 小时前
C# StringBuilder 基础入门
后端
会写代码的建筑师1 小时前
C# 源生成器使用方法
后端·架构
用户638982245891 小时前
Poi-Tl根据word模板生成合并表头使用
后端
梨子同志1 小时前
Spring Framework
后端