Linux 日志管理与分析实战 | rsyslog journald 日志排查教程

日志是 Linux 系统的"黑匣子",记录着系统运行的每一个细节。掌握日志管理与分析技能,是快速定位故障、排查问题的关键。本文将系统讲解 Linux 日志体系、rsyslog 配置、journald 使用、日志轮转及高效分析技巧。
一、Linux 日志体系概览
1.1 常见日志文件
Linux 系统的日志主要存储在 /var/log/ 目录下:
| 日志文件 | 说明 |
|---|---|
/var/log/syslog | 系统主日志(Debian/Ubuntu) |
/var/log/messages | 系统主日志(CentOS/RHEL) |
/var/log/auth.log | 认证日志(SSH、登录等) |
/var/log/secure | 安全日志(CentOS/RHEL) |
/var/log/kern.log | 内核日志 |
/var/log/dmesg | 内核启动日志 |
/var/log/daemon.log | 守护进程日志 |
/var/log/cron | 定时任务日志 |
/var/log/nginx/ | Nginx 访问/错误日志 |
/var/log/apache2/ | Apache 日志 |
/var/log/mysql/ | MySQL 日志 |
1.2 日志级别(Severity)
| 级别 | 数值 | 说明 |
|---|---|---|
| emerg | 0 | 紧急,系统不可用 |
| alert | 1 | 警报,需立即处理 |
| crit | 2 | 严重错误 |
| err | 3 | 错误 |
| warning | 4 | 警告 |
| notice | 5 | 通知(正常但重要) |
| info | 6 | 信息 |
| debug | 7 | 调试信息 |
1.3 日志设施(Facility)
| 设施 | 说明 |
|---|---|
| kern | 内核消息 |
| user | 用户级消息 |
| 邮件系统 | |
| daemon | 系统守护进程 |
| auth | 认证/安全 |
| syslog | syslog 内部消息 |
| lpr | 打印系统 |
| news | 新闻组 |
| uucp | UUCP 系统 |
| cron | 定时任务 |
| local0~local7 | 本地自定义(共 8 个) |
二、rsyslog 配置详解
2.1 配置文件结构
rsyslog 的主配置文件:
/etc/rsyslog.conf— 主配置/etc/rsyslog.d/*.conf— 子配置目录(推荐)
基本语法:
设施.级别 动作示例:
# auth 相关的所有日志写到 auth.log
auth.* /var/log/auth.log
# 所有 info 级别以上(除了 mail、auth、cron)写到 syslog
*.info;mail.none;auth.none;cron.none /var/log/syslog
# 内核所有日志写到 kern.log
kern.* /var/log/kern.log
# 紧急级别消息发给所有在线用户
*.emerg :omusrmsg:*
# 远程日志发送到日志服务器
*.* @192.168.1.100:514 # UDP
*.* @@192.168.1.100:514 # TCP2.2 自定义日志规则
为应用程序配置独立的日志文件:
# /etc/rsyslog.d/myapp.conf
# 将 local0 设施的日志写入 myapp.log
local0.* /var/log/myapp.log
# 仅记录 warning 及以上级别
local0.warning /var/log/myapp-error.log
# 同一规则多个动作(写文件 + 发远程)
local0.* /var/log/myapp.log
local0.* @@log.example.com:514重启 rsyslog 生效:
systemctl restart rsyslog
systemctl status rsyslog2.3 接收远程日志(服务端配置)
# /etc/rsyslog.conf 中启用 UDP 接收
module(load="imudp")
input(type="imudp" port="514")
# 启用 TCP 接收
module(load="imtcp")
input(type="imtcp" port="514")
# 按来源 IP 分开存储日志
:fromhost-ip, isequal, "192.168.1.50" /var/log/remote/server1.log
& stop记得防火墙开放 514 端口:
iptables -A INPUT -p udp --dport 514 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 514 -s 192.168.1.0/24 -j ACCEPT三、systemd journald 使用
3.1 journalctl 基本命令
# 查看所有日志
journalctl
# 查看内核日志(类似 dmesg)
journalctl -k
# 查看指定服务的日志
journalctl -u nginx.service
journalctl -u sshd
# 实时跟踪日志(类似 tail -f)
journalctl -f
journalctl -u nginx -f
# 查看最近 N 行
journalctl -n 50
journalctl -u nginx -n 100
# 按时间范围过滤
journalctl --since "2026-06-24 09:00:00"
journalctl --since "1 hour ago"
journalctl --since "yesterday" --until "today"
journalctl --since "2026-06-01" --until "2026-06-07"3.2 高级过滤
# 按级别过滤(err 及以上)
journalctl -p err
journalctl -p warning..err
# 按优先级显示(0=emerg 到 7=debug)
journalctl -p 3 -x
# 按进程 ID
journalctl _PID=1234
# 按用户 ID
journalctl _UID=1000
# 按可执行文件路径
journalctl /usr/bin/nginx
# 只显示本次启动后的日志
journalctl -b
journalctl -b -1 # 上一次启动
journalctl --list-boots # 列出所有启动记录
# 输出格式
journalctl -o json # JSON 格式
journalctl -o verbose # 详细格式
journalctl -o short-iso # ISO 时间格式3.3 journald 配置
配置文件:/etc/systemd/journald.conf
[Journal]
# 存储位置:auto(默认,优先持久化)、persistent(持久化)、volatile(仅内存)、none(不记录)
Storage=persistent
# 日志占用磁盘空间限制
SystemMaxUse=1G
SystemKeepFree=500M
SystemMaxFileSize=100M
# 日志保留时间
MaxRetentionSec=1month
# 单条消息最大大小
LineMax=48K启用持久化日志:
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald四、日志轮转(logrotate)
4.1 为什么需要日志轮转
日志文件会不断增长,占用磁盘空间。logrotate 自动实现:
- 按周期(日/周/月)切割日志
- 压缩旧日志
- 删除过期日志
- 发送邮件通知
4.2 配置文件
主配置:/etc/logrotate.conf 自定义配置:/etc/logrotate.d/ 目录
Nginx 日志轮转示例:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天轮转
missingok # 日志不存在不报错
rotate 30 # 保留 30 份
compress # 压缩旧日志
delaycompress # 延迟压缩(下一次轮转时再压缩)
notifempty # 空日志不轮转
create 0640 www-data adm # 新日志权限
sharedscripts # 所有日志轮转完后只执行一次脚本
postrotate # 轮转后执行的命令
if [ -f /run/nginx.pid ]; then
kill -USR1 `cat /run/nginx.pid`
fi
endscript
}4.3 常用配置参数
| 参数 | 说明 |
|---|---|
| daily/weekly/monthly | 轮转周期 |
| rotate N | 保留 N 份旧日志 |
| compress | 启用 gzip 压缩 |
| delaycompress | 延迟一次再压缩 |
| missingok | 日志不存在不报错 |
| notifempty | 空文件不轮转 |
| size 100M | 达到指定大小就轮转 |
| maxage 30 | 删除 30 天前的日志 |
| create 模式 用户 组 | 新日志文件属性 |
| dateext | 日志文件名加日期后缀 |
| postrotate/endscript | 轮转后执行脚本 |
| prerotate/endscript | 轮转前执行脚本 |
4.4 手动测试
# 调试模式(不实际执行)
logrotate -d /etc/logrotate.d/nginx
# 强制执行(即使不到时间)
logrotate -f /etc/logrotate.d/nginx
# 查看 logrotate 定时任务
cat /etc/cron.daily/logrotate五、日志分析常用命令
5.1 grep 系列
# 搜索包含关键词的行
grep "error" /var/log/syslog
grep "Failed password" /var/log/auth.log
# 忽略大小写
grep -i "error" /var/log/nginx/error.log
# 显示行号
grep -n "error" /var/log/syslog
# 统计匹配行数
grep -c "error" /var/log/syslog
# 反向匹配(不包含关键词)
grep -v "debug" /var/log/syslog
# 同时匹配多个关键词(或)
grep -E "error|warning" /var/log/syslog
# 同时匹配多个关键词(与)
grep "error" /var/log/syslog | grep "nginx"
# 显示匹配行前后上下文
grep -C 3 "error" /var/log/syslog # 前后各 3 行
grep -B 2 "error" /var/log/syslog # 之前 2 行
grep -A 5 "error" /var/log/syslog # 之后 5 行
# 递归搜索目录
grep -r "error" /var/log/
grep -rn "error" /var/log/nginx/5.2 tail / head
# 实时跟踪日志
tail -f /var/log/nginx/access.log
tail -F /var/log/syslog # 日志轮转后自动跟踪新文件
# 显示最后 N 行
tail -n 100 /var/log/syslog
# 从第 N 行开始显示
tail -n +100 /var/log/syslog
# 显示前 N 行
head -n 50 /var/log/syslog5.3 awk 高级分析
# 提取某一列(空格分隔)
awk '{print $1, $5, $9}' /var/log/nginx/access.log
# 按状态码统计访问次数
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 统计访问量 Top 10 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 统计访问量前 10 的 URL
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 按时间段统计(按小时)
awk '{print substr($4, 2, 14)}' /var/log/nginx/access.log | sort | uniq -c
# 统计 5xx 错误的 IP
awk '$9 ~ /^5/ {print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# 统计响应时间大于 1 秒的请求
awk '$(NF-1) > 1.0 {print $0}' /var/log/nginx/access.log | head -205.4 其他实用命令
# 去重统计
sort access.log | uniq -c | sort -rn
# wc 统计行数/字数/字节数
wc -l /var/log/syslog
wc -c /var/log/syslog
# cut 按分隔符截取
cut -d' ' -f1,7 /var/log/nginx/access.log
# sed 替换/提取
sed -n '100,200p' /var/log/syslog # 查看 100-200 行
sed '/error/d' /var/log/syslog # 删除包含 error 的行
# zcat 查看压缩日志
zcat /var/log/syslog.2.gz | grep "error"
zless /var/log/syslog.2.gz六、实战:常见故障日志排查
6.1 SSH 登录失败排查
# 查看所有登录失败记录
grep "Failed password" /var/log/auth.log
# 查看被暴力破解的 Top IP
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 查看成功登录记录
grep "Accepted" /var/log/auth.log
# 查看 root 登录尝试
grep "Failed password for root" /var/log/auth.log | wc -l6.2 Nginx 5xx 错误排查
# 统计 5xx 错误数量
grep " 5[0-9][0-9] " /var/log/nginx/access.log | wc -l
# 找出 5xx 错误的 URL Top 10
grep " 5[0-9][0-9] " /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -10
# 查看详细错误日志
tail -n 100 /var/log/nginx/error.log
# 查看最近 1 小时的 5xx 错误
awk -v d="$(date -d '1 hour ago' '+%d/%b/%Y:%H:%M:%S')" '$4 > "["d {print $0}' /var/log/nginx/access.log | grep " 5[0-9][0-9] "6.3 系统重启/关机记录
# 查看系统重启记录
last reboot
# 查看关机记录
last -x shutdown
# 查看登录历史
last
last -a # IP 显示在最后一列
lastb # 登录失败记录
# journald 方式
journalctl --list-boots
journalctl -b -1 -u sshd # 上一次启动时的 sshd 日志6.4 内存不足(OOM)排查
# 搜索 OOM 记录
grep -i "out of memory" /var/log/syslog
grep -i "oom-killer" /var/log/syslog
# 查看哪个进程被 kill
grep "Killed process" /var/log/syslog
# journald 方式
journalctl -k | grep -i oom
journalctl -p err -k6.5 磁盘空间占用排查
# 找出最大的日志文件
du -sh /var/log/* | sort -rh | head -10
# 查找大于 100M 的日志文件
find /var/log -type f -size +100M -exec ls -lh {} \;
# 查看已删除但仍被占用的文件(释放空间)
lsof | grep deleted | grep -i log七、日志安全与最佳实践
7.1 日志安全建议
- 集中化日志:将日志发送到独立的日志服务器,防止被攻击者篡改
- 权限控制:bash
chmod 640 /var/log/auth.log chown root:adm /var/log/auth.log - 日志完整性:使用不可变位(防止被删除/修改)bash
chattr +a /var/log/auth.log # 只能追加,不能删除修改 - 定期备份:重要日志异地备份
- 监控告警:错误日志超过阈值及时告警
7.2 日志管理最佳实践
- 结构化日志:应用程序输出 JSON 格式日志,便于分析
- 统一日志格式:所有服务使用相同的时间戳格式
- 合理日志级别:生产环境避免 debug 级日志过多
- 请求追踪 ID:分布式系统添加 trace-id 串联请求
- 定期审计:定期检查异常登录、权限变更等安全日志
八、日志分析工具推荐
8.1 命令行工具
- lnav — 增强版日志查看器,支持彩色高亮、过滤
- ** multitail** — 多窗口同时跟踪多个日志
- goaccess — Nginx/Apache 日志实时分析,生成报表
8.2 集中化日志系统
- ELK Stack(Elasticsearch + Logstash + Kibana)— 经典组合
- EFK Stack(Elasticsearch + Fluentd + Kibana)
- Loki + Grafana — 轻量级日志方案
- Graylog — 开箱即用的日志管理平台
安装 lnav 示例:
# Ubuntu/Debian
apt install lnav
# 使用
lnav /var/log/syslog
lnav /var/log/nginx/access.log九、总结
Linux 日志管理是系统管理员的核心技能,本文涵盖了:
- ✅ Linux 日志体系结构(设施、级别、常见日志文件)
- ✅ rsyslog 配置(本地日志、远程日志、自定义规则)
- ✅ systemd journald 使用(journalctl 常用命令)
- ✅ 日志轮转(logrotate 配置与最佳实践)
- ✅ 日志分析命令(grep、awk、sed 等实战技巧)
- ✅ 常见故障排查(SSH、Nginx、OOM 等)
- ✅ 日志安全与最佳实践
掌握这些技能,你就能在系统出现问题时快速定位根因,成为高效的运维工程师。
相关阅读: