19- 日志分析与监控(journald、rsyslog、logrotate) 📜
前提条件 ✅
- 已完成 LVM、NFS/Samba 共享、备份配置(/data 可用于存放日志归档)
- 以 ops 用户登录(具有 sudo 权限)
- 系统运行在 Debian 12 Bookworm
- 虚拟机环境:VMware Workstation Pro(建议有足够磁盘空间观察日志增长)
详细步骤 🛠️
- journald – systemd 默认日志系统
Debian 12 默认使用 journald 收集所有系统和服务日志。
常用查看命令:
journalctl -b # 本次启动所有日志
journalctl -u ssh -n 200 # ssh 服务最近 200 行
journalctl -u ssh -f # 实时跟踪(类似 tail -f)
journalctl -p err -b # 本次启动的错误及以上级别
journalctl --since "2026-01-01" # 指定时间范围
journalctl --disk-usage # 查看占用空间
配置 journald 永久存储(默认 volatile,重启丢失):
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
编辑持久化配置:
sudo nano /etc/systemd/journald.conf
推荐生产设置:
[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=10G # 最大占用 10GB
SystemKeepFree=20% # 保留 20% 磁盘空间
RuntimeMaxUse=2G
MaxRetentionSec=1month # 保留 1 个月
应用:
sudo systemctl restart systemd-journald
- rsyslog – 传统文本日志系统(兼容旧工具)
Debian 默认同时运行 rsyslog,将 journal 日志转发到 /var/log 文件。
查看主要日志文件:
ls -lh /var/log/
tail -f /var/log/syslog
tail -f /var/log/auth.log # 认证相关(SSH 登录等)
tail -f /var/log/kern.log
配置 rsyslog 转发(示例:将 auth 日志单独写文件):
sudo nano /etc/rsyslog.d/10-custom.conf
添加:
if $programname == 'sshd' then /var/log/sshd.log
& stop
重启:
sudo systemctl restart rsyslog
- logrotate – 日志轮转与压缩
Debian 默认已安装 logrotate,每日自动轮转 /var/log/*。
查看当前配置:
sudo cat /etc/logrotate.d/*
sudo logrotate -d /etc/logrotate.conf # 调试模式(不实际执行)
自定义轮转规则(示例:自定义服务日志):
sudo nano /etc/logrotate.d/myapp
内容:
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 ops ops
postrotate
systemctl reload myapp || true
endscript
}
手动触发轮转测试:
sudo logrotate -f /etc/logrotate.conf
- 日志监控与告警基础(简单实现)
实时监控关键日志:tail -f /var/log/auth.log | grep --line-buffered "Failed password"
结合 fail2ban(已安装)自动处理 SSH 暴力破解。
高级:安装 logwatch 或 goaccess(后续章节可扩展):
sudo apt install -y logwatch
sudo logwatch --detail High --mailto your@email.com --service all
实践任务 🎯
- 配置 journald 为 persistent 模式,确认 /var/log/journal 目录出现并有日志写入
- 用 journalctl -u ssh -f 实时监控 SSH 日志,同时从另一台机器尝试登录观察输出
- 查看 /var/log/auth.log 和 /var/log/syslog,找出最近一次 SSH 登录记录
- 创建自定义 logrotate 规则针对一个测试日志文件(例如 /var/log/test.log),手动触发轮转并验证压缩文件生成
自测问题 ❓
- journald 的 Storage=persistent 和 volatile 的区别是什么?
- 为什么生产环境建议限制 journald 的 SystemMaxUse?
- logrotate 中的 delaycompress 选项有什么实际作用?
- 如何用 journalctl 只显示今天以来所有错误级别的日志?
总结 📌
日志是系统“黑匣子”,journald + rsyslog + logrotate 构成 Debian 完整日志体系。
生产中优先用 journalctl 排查实时问题,rsyslog 保证文本兼容,logrotate 防止磁盘爆满。
后续 Web、数据库、容器章节中,日志路径配置、异常监控都将依赖这些工具,形成“日志 → 告警 → 响应”的闭环。