日志管理与排查 — 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 三步快筛;日志持久化要配好,别等宕机才后悔没存档。

相关推荐
zhenlai20122 小时前
Vue3 + SpringBoot + AI:我做了一个股票分析工具(第1周复盘)
人工智能·spring boot·后端
Oneslide9 小时前
Ubuntu 26.04 完整安装 Fcitx5 中文拼音输入法指南(适配默认Wayland)
后端
huangdong_10 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
掘金码甲哥10 小时前
3min手搓一个帮助文档站,很合理吧!
后端
ServBay14 小时前
别再用初级写法写Rust了,8个写法你值得拥有
后端·rust
jingling55515 小时前
go | 环境安装和快速入门
开发语言·后端·golang
Darren24515 小时前
流程步骤模板 - @StepStatus 注解方案
后端
小闹54915 小时前
Claude Code 给自己接了一部飞书,从此不用守在工位等它
后端·claude