跳转到内容

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

Linux 日志管理与分析

日志是 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)

级别数值说明
emerg0紧急,系统不可用
alert1警报,需立即处理
crit2严重错误
err3错误
warning4警告
notice5通知(正常但重要)
info6信息
debug7调试信息

1.3 日志设施(Facility)

设施说明
kern内核消息
user用户级消息
mail邮件系统
daemon系统守护进程
auth认证/安全
syslogsyslog 内部消息
lpr打印系统
news新闻组
uucpUUCP 系统
cron定时任务
local0~local7本地自定义(共 8 个)

二、rsyslog 配置详解

2.1 配置文件结构

rsyslog 的主配置文件:

  • /etc/rsyslog.conf — 主配置
  • /etc/rsyslog.d/*.conf — 子配置目录(推荐)

基本语法:

设施.级别        动作

示例:

bash
# 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   # TCP

2.2 自定义日志规则

为应用程序配置独立的日志文件:

bash
# /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 生效:

bash
systemctl restart rsyslog
systemctl status rsyslog

2.3 接收远程日志(服务端配置)

bash
# /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 端口:

bash
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 基本命令

bash
# 查看所有日志
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 高级过滤

bash
# 按级别过滤(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

ini
[Journal]
# 存储位置:auto(默认,优先持久化)、persistent(持久化)、volatile(仅内存)、none(不记录)
Storage=persistent

# 日志占用磁盘空间限制
SystemMaxUse=1G
SystemKeepFree=500M
SystemMaxFileSize=100M

# 日志保留时间
MaxRetentionSec=1month

# 单条消息最大大小
LineMax=48K

启用持久化日志:

bash
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 日志轮转示例:

bash
# /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 手动测试

bash
# 调试模式(不实际执行)
logrotate -d /etc/logrotate.d/nginx

# 强制执行(即使不到时间)
logrotate -f /etc/logrotate.d/nginx

# 查看 logrotate 定时任务
cat /etc/cron.daily/logrotate

五、日志分析常用命令

5.1 grep 系列

bash
# 搜索包含关键词的行
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

bash
# 实时跟踪日志
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/syslog

5.3 awk 高级分析

bash
# 提取某一列(空格分隔)
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 -20

5.4 其他实用命令

bash
# 去重统计
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 登录失败排查

bash
# 查看所有登录失败记录
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 -l

6.2 Nginx 5xx 错误排查

bash
# 统计 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 系统重启/关机记录

bash
# 查看系统重启记录
last reboot

# 查看关机记录
last -x shutdown

# 查看登录历史
last
last -a  # IP 显示在最后一列
lastb   # 登录失败记录

# journald 方式
journalctl --list-boots
journalctl -b -1 -u sshd  # 上一次启动时的 sshd 日志

6.4 内存不足(OOM)排查

bash
# 搜索 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 -k

6.5 磁盘空间占用排查

bash
# 找出最大的日志文件
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 日志安全建议

  1. 集中化日志:将日志发送到独立的日志服务器,防止被攻击者篡改
  2. 权限控制
    bash
    chmod 640 /var/log/auth.log
    chown root:adm /var/log/auth.log
  3. 日志完整性:使用不可变位(防止被删除/修改)
    bash
    chattr +a /var/log/auth.log  # 只能追加,不能删除修改
  4. 定期备份:重要日志异地备份
  5. 监控告警:错误日志超过阈值及时告警

7.2 日志管理最佳实践

  1. 结构化日志:应用程序输出 JSON 格式日志,便于分析
  2. 统一日志格式:所有服务使用相同的时间戳格式
  3. 合理日志级别:生产环境避免 debug 级日志过多
  4. 请求追踪 ID:分布式系统添加 trace-id 串联请求
  5. 定期审计:定期检查异常登录、权限变更等安全日志

八、日志分析工具推荐

8.1 命令行工具

  • lnav — 增强版日志查看器,支持彩色高亮、过滤
  • ** multitail** — 多窗口同时跟踪多个日志
  • goaccess — Nginx/Apache 日志实时分析,生成报表

8.2 集中化日志系统

  • ELK Stack(Elasticsearch + Logstash + Kibana)— 经典组合
  • EFK Stack(Elasticsearch + Fluentd + Kibana)
  • Loki + Grafana — 轻量级日志方案
  • Graylog — 开箱即用的日志管理平台

安装 lnav 示例:

bash
# 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 等)
  • ✅ 日志安全与最佳实践

掌握这些技能,你就能在系统出现问题时快速定位根因,成为高效的运维工程师。


相关阅读: