Linux 日志系统管理完整指南
目录
- 日志系统架构
- zram 设备管理
- Armbian Ramlog 详解
- Systemd Journald 配置
- 日志清理与维护
- 监控与自动化
- 最佳实践
日志系统架构
两种日志系统的关系
应用程序/服务
↓
systemd-journald (日志收集器)
↓
/var/log/journal/ (日志存储)
↓
armbian-ramlog (存储位置管理)
↓
zram0 (压缩内存设备) → 定期同步 → /var/log.hdd (磁盘备份)
核心组件对比
| 组件 | 作用 | 存储位置 | 主要命令 |
|---|
| systemd-journald | 日志收集器,收集所有系统日志 | /var/log/journal/ (持久化)
/run/log/journal/ (运行时) | journalctl |
| armbian-ramlog | 日志存储管理器,将 /var/log 放入内存 | /var/log (内存)
/var/log.hdd (磁盘备份) | armbian-ramlog sync |
| zram | 压缩内存块设备 | /dev/zram0, /dev/zram1 | zramctl |
zram 设备管理
查看 zram 状态
# 查看所有 zram 设备
zramctl
# 输出示例
NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram1 lzo-rle 499.8M 4K 73B 4K 4 [SWAP]
/dev/zram0 zstd 128M 2.6M 551K 988K 4 /var/log
zramctl 输出字段说明
| 字段 | 说明 |
|---|
| NAME | 设备名称 |
| ALGORITHM | 压缩算法 (lzo-rle, zstd, lz4 等) |
| DISKSIZE | 分配的磁盘大小 |
| DATA | 实际数据大小 |
| COMPR | 压缩后大小 |
| TOTAL | 总占用内存(包含元数据) |
| STREAMS | 压缩流数量 |
| MOUNTPOINT | 挂载点(如有) |
zram 设备操作命令
# 重置 zram 设备(清空数据)
sudo zramctl -r /dev/zram0
# 创建新 zram 设备
sudo zramctl /dev/zram0 --algorithm zstd --size 128M
# 调整设备大小
echo 0 > /sys/block/zram0/disksize # 清空
echo 256M > /sys/block/zram0/disksize # 重新设置大小
# 查看设备统计信息
cat /sys/block/zram0/stat
zram stat 字段说明
字段顺序: 读取次数, 合并读, 读取扇区数, 读耗时(ms),
写入次数, 合并写, 写入扇区数, 写耗时(ms),
IO进行中, IO耗时(ms), 加权IO耗时(ms)
Armbian Ramlog 详解
配置文件位置
/etc/default/armbian-ramlog # 主配置
/etc/default/pbsbc01h3-ramlog # 特定设备配置(如有)
配置参数说明
# 启用/禁用 ramlog
ENABLED=true
# 分配的内存大小
SIZE=128M
# 使用 rsync 同步(性能更好)
USE_RSYNC=true
# rsync 额外参数(删除硬盘上已不存在的文件)
XTRA_RSYNC_TO=(--delete)
ramlog 工作原理
- 启动时:从磁盘
/var/log.hdd 恢复到内存 /var/log - 运行时:所有日志写入内存中的
/var/log - 定期同步:通过 cron 或服务将内存日志同步到磁盘
- 关机时:将内存日志同步到磁盘保存
常用操作命令
# 手动同步内存日志到磁盘
/usr/lib/armbian/armbian-ramlog sync
# 重启 ramlog 服务
systemctl restart armbian-ramlog
# 查看服务状态
systemctl status armbian-ramlog
# 临时禁用 ramlog
systemctl stop armbian-ramlog
umount /var/log
调整 ramlog 大小
# 修改配置文件
sed -i 's/SIZE=128M/SIZE=256M/' /etc/default/armbian-ramlog
# 重启服务生效
systemctl restart armbian-ramlog
# 验证
df -h /var/log
zramctl
Systemd Journald 配置
配置文件位置
/etc/systemd/journald.conf # 主配置文件
/etc/systemd/journald.conf.d/*.conf # 配置片段(推荐)
推荐配置(限制日志大小)
# 创建配置目录
mkdir -p /etc/systemd/journald.conf.d
# 创建配置文件
cat > /etc/systemd/journald.conf.d/limits.conf << 'EOF'
[Journal]
# 持久化日志限制(存储在 /var/log/journal)
SystemMaxUse=100M
SystemKeepFree=200M
SystemMaxFileSize=20M
# 运行时日志限制(存储在 /run/log/journal)
RuntimeMaxUse=50M
RuntimeMaxFileSize=10M
# 日志保留时间
MaxRetentionSec=7day
# 启用压缩
Compress=yes
# 转发设置
ForwardToSyslog=yes
# 同步间隔
SyncIntervalSec=5m
# 速率限制
RateLimitIntervalSec=30s
RateLimitBurst=1000
EOF
# 重启服务
systemctl restart systemd-journald
journald 存储模式
| 模式 | 说明 | 配置值 |
|---|
| persistent | 持久化到 /var/log/journal | Storage=persistent |
| volatile | 仅存储在内存 /run/log/journal | Storage=volatile |
| auto | 自动(有目录则持久化) | Storage=auto |
| none | 不存储日志 | Storage=none |
journalctl 常用命令
# 查看日志大小
journalctl --disk-usage
# 清理日志(按大小)
journalctl --vacuum-size=100M
# 清理日志(按时间)
journalctl --vacuum-time=7d
# 清理日志(按文件数)
journalctl --vacuum-files=5
# 强制轮转日志
journalctl --rotate
# 查看当前配置
journalctl --show-config
# 查看系统日志
journalctl -xe
# 查看特定服务日志
journalctl -u sshd
# 实时跟踪日志
journalctl -f
日志清理与维护
查看当前日志使用情况
# 查看 ramlog 使用率
df -h /var/log
# 查看 journal 日志大小
journalctl --disk-usage
# 查看各日志文件大小
du -sh /var/log/* | sort -h
# 查看 zram 状态
zramctl
手动清理步骤
# 1. 清理 journal 日志
journalctl --vacuum-size=50M
# 2. 清理旧日志文件(7天前)
find /var/log -name "*.log" -type f -mtime +7 -delete
# 3. 清理压缩日志(30天前)
find /var/log -name "*.gz" -type f -mtime +30 -delete
# 4. 清理轮转文件
find /var/log -name "*.1" -delete
find /var/log -name "*.old" -delete
# 5. 同步到磁盘并清理内存
/usr/lib/armbian/armbian-ramlog sync
# 6. 验证清理结果
df -h /var/log
配置 logrotate 自动轮转
cat > /etc/logrotate.d/custom-logs << 'EOF'
# 系统日志轮转
/var/log/syslog
/var/log/messages
/var/log/auth.log
/var/log/kern.log
{
daily
rotate 7
maxsize 20M
compress
delaycompress
missingok
notifempty
create 644 root root
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
# Proxmox 相关日志
/var/log/pbs*.log
/var/log/proxmox*.log
{
daily
rotate 3
maxsize 50M
compress
missingok
notifempty
create 644 root root
}
EOF
# 测试配置
logrotate -d /etc/logrotate.conf
监控与自动化
日志健康检查脚本
#!/bin/bash
# /usr/local/bin/log-health.sh
echo "=== 日志健康检查 ==="
echo
# 1. 检查 ramlog 使用率
RAMLOG_USAGE=$(df -h /var/log | awk 'NR==2 {print $5}' | sed 's/%//')
RAMLOG_SIZE=$(df -h /var/log | awk 'NR==2 {print $3}')
echo "📊 Ramlog 使用: $RAMLOG_SIZE / 128M ($RAMLOG_USAGE%)"
# 2. 检查 journal 大小
JOURNAL_SIZE=$(journalctl --disk-usage 2>/dev/null | awk '{print $3, $4}')
echo "📋 Journal 日志: $JOURNAL_SIZE"
# 3. 检查日志文件数量
LOG_COUNT=$(find /var/log -name "*.log" -type f | wc -l)
echo "📄 日志文件数: $LOG_COUNT"
# 4. 最大的日志文件
echo -e "\n🔍 最大的日志文件:"
du -sh /var/log/*.log 2>/dev/null | sort -h | tail -3
# 5. 状态评估
echo -e "\n✅ 状态评估:"
if [ "$RAMLOG_USAGE" -gt 80 ]; then
echo "⚠️ 警告: ramlog 使用率 ${RAMLOG_USAGE}%,建议清理"
elif [ "$RAMLOG_USAGE" -gt 60 ]; then
echo "📌 注意: ramlog 使用率 ${RAMLOG_USAGE}%,可以关注"
else
echo "✅ 良好: ramlog 使用率 ${RAMLOG_USAGE}%"
fi
# 6. 维护建议
echo -e "\n💡 维护命令:"
echo " - 清理旧日志: journalctl --vacuum-time=7d"
echo " - 手动同步: /usr/lib/armbian/armbian-ramlog sync"
echo " - 查看详细: journalctl --disk-usage"
自动清理脚本
#!/bin/bash
# /etc/cron.daily/clean-logs
# 每日自动清理日志
# 清理 journal 日志(保留 50M)
journalctl --vacuum-size=50M
# 清理 7 天前的日志
find /var/log -name "*.log" -type f -mtime +7 -delete 2>/dev/null
find /var/log -name "*.gz" -type f -mtime +30 -delete 2>/dev/null
# 清理空文件
find /var/log -type f -empty -delete 2>/dev/null
# 同步 ramlog 到磁盘
/usr/lib/armbian/armbian-ramlog sync 2>/dev/null
# 记录清理时间
echo "$(date): Logs cleaned" >> /var/log/log-cleanup.log
监控脚本(每小时检查)
#!/bin/bash
# /usr/local/bin/monitor_logs.sh
WARN_THRESHOLD=70
CRIT_THRESHOLD=85
USAGE=$(df -h /var/log | awk 'NR==2 {print $5}' | sed 's/%//')
JOURNAL_SIZE=$(journalctl --disk-usage | grep -oP '\d+\.?\d* [MG]' | head -1)
if [ -n "$USAGE" ] && [ "$USAGE" -gt "$CRIT_THRESHOLD" ]; then
echo "CRITICAL: /var/log usage is ${USAGE}%"
# 自动清理
journalctl --vacuum-size=40M
/usr/lib/armbian/armbian-ramlog sync
elif [ -n "$USAGE" ] && [ "$USAGE" -gt "$WARN_THRESHOLD" ]; then
echo "WARNING: /var/log usage is ${USAGE}%"
fi
# 如果 journal 超过 40M,自动清理
if [[ "$JOURNAL_SIZE" =~ ^[0-9]+ ]] && [ "${JOURNAL_SIZE%[A-Z]*}" -gt 40 ]; then
journalctl --vacuum-size=40M
fi
设置定时任务
# 添加到 crontab
chmod +x /usr/local/bin/log-health.sh
chmod +x /etc/cron.daily/clean-logs
chmod +x /usr/local/bin/monitor_logs.sh
# 每小时检查一次
echo "0 * * * * /usr/local/bin/monitor_logs.sh >> /var/log/log-monitor.log 2>&1" | crontab -
# 每天健康检查
echo "0 9 * * * /usr/local/bin/log-health.sh >> /var/log/log-health.log 2>&1" | crontab -
最佳实践
1. 日志大小配置建议
| 场景 | ramlog 大小 | journald 限制 | 说明 |
|---|
| SD卡设备 | 128M-256M | 50M-100M | 减少写入,保护存储 |
| 内存充足 | 256M-512M | 100M-200M | 保留更多调试信息 |
| 内存紧张 | 64M-128M | 30M-50M | 节省内存资源 |
2. 压缩算法选择
# zstd - 压缩率最高,速度适中(推荐)
zramctl /dev/zram0 --algorithm zstd --size 128M
# lzo-rle - 速度最快,压缩率较低
zramctl /dev/zram0 --algorithm lzo-rle --size 128M
# lz4 - 速度较快,压缩率中等
zramctl /dev/zram0 --algorithm lz4 --size 128M
3. 故障排查命令速查
| 问题 | 排查命令 |
|---|
| 无法重置 zram | lsof /dev/zram0
fuser -v /dev/zram0 |
| 日志占满内存 | du -sh /var/log/*
journalctl --disk-usage |
| 查看谁在使用 | `ls -la /proc//fd/ 2>/dev/null \ | grep zram` |
| 查看内核错误 | `dmesg \ | grep -i zram` |
| 检查挂载点 | `mount \ | grep zram<br>df -h /var/log` |
4. 安全操作清单
# ✅ 清理前检查
df -h /var/log
zramctl
journalctl --disk-usage
# ✅ 备份重要日志(可选)
tar -czf /tmp/logs_backup_$(date +%Y%m%d).tar.gz /var/log/
# ✅ 执行清理
journalctl --vacuum-size=50M
/usr/lib/armbian/armbian-ramlog sync
# ✅ 验证结果
df -h /var/log
zramctl
5. 日常维护检查清单
- [ ] 每周检查:
df -h /var/log 使用率 < 70% - [ ] 每月清理:
journalctl --vacuum-time=30d - [ ] 定期验证:
zramctl 设备状态正常 - [ ] 日志轮转:
logrotate -d /etc/logrotate.conf 测试 - [ ] 监控告警:设置 cron 定时检查
6. 常见问题解决
问题1:无法重置 zram(Device or resource busy)
# 解决方法
swapoff -a
umount /var/log
fuser -k /dev/zram0
zramctl -r /dev/zram0
问题2:journald 配置不生效
# 解决方法
systemctl cat systemd-journald | grep -E "SystemMax|RuntimeMax"
systemctl restart systemd-journald
journalctl --rotate
journalctl --vacuum-size=100M
问题3:ramlog 不同步
# 解决方法
systemctl restart armbian-ramlog
/usr/lib/armbian/armbian-ramlog sync
ls -la /var/log.hdd/ # 检查备份目录
总结
关键要点
- systemd-journald 负责收集日志,armbian-ramlog 负责将日志放入内存
- 两者协同工作,保护存储设备,提升性能
- 合理配置大小限制是防止内存占满的关键
- 定期清理和监控是维护日志健康的重要手段
推荐配置组合
# ramlog: 128M 内存
SIZE=128M
# journald: 50M 限制
SystemMaxUse=50M
# 自动清理: 每天
0 2 * * * /etc/cron.daily/clean-logs
# 监控: 每小时
0 * * * * /usr/local/bin/monitor_logs.sh
最终检查命令
# 一键检查日志健康状态
echo "=== 日志系统状态 ===" && \
echo "Ramlog: $(df -h /var/log | tail -1)" && \
echo "Journal: $(journalctl --disk-usage)" && \
echo "Zram: $(zramctl | grep zram0)" && \
echo "使用率: $(df -h /var/log | awk 'NR==2 {print $5}')"
本文档基于 Proxmox Backup Server (PBS) 环境整理,适用于 Debian/Armbian 系统