Linux日志管理
日志是系统诊断和故障排查的重要依据,Linux提供了完善的日志系统。
日志系统架构
应用程序/服务
↓
rsyslog ──→ /var/log/... (传统日志文件)
↓
systemd-journald ──→ journal (二进制日志)
journalctl (systemd日志)
基本查询
# 查看所有日志
journalctl
# 查看本次启动的日志
journalctl -b
# 查看上一次启动的日志
journalctl -b -1
# 实时查看日志
journalctl -f
# 反向显示(最新在前)
journalctl -r
时间过滤
# 最近N行
journalctl -n 50
journalctl -n 100
# 时间范围
journalctl --since "2026-04-20 10:00:00"
journalctl --until "2026-04-20 12:00:00"
journalctl --since "today"
journalctl --since "yesterday"
journalctl --since "1 hour ago"
journalctl --since "30 minutes ago"
# 组合使用
journalctl --since "2026-04-20 08:00" --until "2026-04-20 10:00"
单元过滤
# 按服务单元
journalctl -u nginx
journalctl -u sshd
journalctl -u docker
# 多个单元
journalctl -u nginx -u mysql
# 组合时间过滤
journalctl -u nginx --since "1 hour ago"
优先级过滤
# 按优先级
journalctl -p emerg # 紧急
journalctl -p alert # 警报
journalctl -p crit # 严重
journalctl -p err # 错误
journalctl -p warning # 警告
journalctl -p notice # 通知
journalctl -p info # 信息
journalctl -p debug # 调试
# 范围过滤(从err到更高优先级)
journalctl -p err -b
用户和进程过滤
# 按用户
journalctl _UID=1000
# 按进程ID
journalctl _PID=1234
# 按可执行文件
journalctl /usr/sbin/sshd
输出格式
# JSON格式
journalctl -o json
# JSON美化
journalctl -o json-pretty
# 仅显示消息
journalctl -o cat
# 详细格式
journalctl -o verbose
磁盘管理
# 查看日志占用空间
journalctl --disk-usage
# 清理旧日志(保留最近)
journalctl --vacuum-time=7d # 保留7天
journalctl --vacuum-size=500M # 限制总大小
# 编辑配置限制日志大小
# /etc/systemd/journald.conf
SystemMaxUse=500M
RuntimeMaxUse=100M
传统日志文件
常见日志文件
| 文件 | 说明 |
|---|
| /var/log/syslog | 系统主日志(Debian/Ubuntu) |
| /var/log/messages | 系统主日志(RHEL/CentOS) |
| /var/log/auth.log | 认证日志(Debian/Ubuntu) |
| /var/log/secure | 认证日志(RHEL/CentOS) |
| /var/log/kern.log | 内核日志 |
| /var/log/dmesg | 启动信息 |
| /var/log/cron | 定时任务日志 |
| /var/log/boot.log | 启动日志 |
查看日志
# 查看文件
cat /var/log/syslog
less /var/log/syslog
# 实时查看
tail -f /var/log/syslog
tail -f /var/log/auth.log
# 查看最近N行
tail -n 100 /var/log/syslog
# 查看开头
head -n 50 /var/log/syslog
搜索日志
# grep搜索
grep "error" /var/log/syslog
grep -i "error" /var/log/syslog # 忽略大小写
grep "Failed password" /var/log/auth.log
# 多文件搜索
grep -r "error" /var/log/
# 统计匹配次数
grep -c "error" /var/log/syslog
# 显示行号
grep -n "error" /var/log/syslog
# 上下文
grep -A 5 "error" /var/log/syslog # 后5行
grep -B 5 "error" /var/log/syslog # 前5行
grep -C 5 "error" /var/log/syslog # 前后各5行
rsyslog配置
配置文件
# 主配置文件
/etc/rsyslog.conf
# 子配置目录
/etc/rsyslog.d/
规则语法
facility.priority action
# facility: auth, cron, daemon, kern, mail, user, local0-7, * (所有)
# priority: debug, info, notice, warning, err, crit, alert, emerg, * (所有), none (排除)
# action: 日志文件路径、远程服务器、用户终端等
配置示例
# /etc/rsyslog.d/50-default.conf
# 所有info及以上级别写入syslog
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 认证日志单独存放
authpriv.* /var/log/secure
# 邮件日志
mail.* -/var/log/maillog
# 定时任务日志
cron.* /var/log/cron
# 发送到远程日志服务器
*.* @logserver:514 # UDP
*.* @@logserver:514 # TCP
重启服务
sudo systemctl restart rsyslog
sudo systemctl status rsyslog
日志轮转 (logrotate)
配置文件
# 主配置
/etc/logrotate.conf
# 子配置目录
/etc/logrotate.d/
配置示例
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天轮转
missingok # 日志文件不存在不报错
rotate 14 # 保留14天
compress # 压缩旧日志
delaycompress # 延迟压缩
notifempty # 空文件不轮转
create 0640 www-data adm # 创建新文件权限
sharedscripts # 共享脚本
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
手动执行
# 测试配置
logrotate -d /etc/logrotate.conf
# 强制执行
logrotate -f /etc/logrotate.conf
# 查看状态
cat /var/lib/logrotate/status
日志分析技巧
查找错误
# 系统错误
journalctl -p err -b
# 认证失败
grep "Failed password" /var/log/auth.log | tail -20
# SSH登录尝试
grep "Accepted password\|Failed password" /var/log/auth.log
# 暴力破解IP统计
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
磁盘空间监控
# 查看日志目录大小
du -sh /var/log/
# 大文件排序
du -h /var/log/ | sort -rh | head -10
# journal日志空间
journalctl --disk-usage
性能分析
# 启动时间分析
systemd-analyze
systemd-analyze blame # 各服务启动时间
systemd-analyze critical-chain # 关键启动链
# 查看启动错误
journalctl -b -p err
集中式日志
发送到远程服务器
# 客户端配置 /etc/rsyslog.conf
*.* @@logserver.example.com:514
# 服务端配置 /etc/rsyslog.conf
# 加载模块
module(load="imtcp")
input(type="imtcp" port="514")
# 按主机分开存储
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
快速参考
| 命令 | 说明 |
|---|
journalctl | 查看systemd日志 |
journalctl -f | 实时日志 |
journalctl -u service | 按服务过滤 |
journalctl --since "1h ago" | 时间过滤 |
journalctl -p err | 错误级别 |
tail -f /var/log/syslog | 实时查看文件 |
grep "error" /var/log/syslog | 搜索日志 |
journalctl --disk-usage | 日志空间 |
logrotate -f /etc/logrotate.conf | 强制轮转 |