Linux 日志系统管理完整指南

目录

  1. 日志系统架构
  2. zram 设备管理
  3. Armbian Ramlog 详解
  4. Systemd Journald 配置
  5. 日志清理与维护
  6. 监控与自动化
  7. 最佳实践

日志系统架构

两种日志系统的关系

应用程序/服务
    ↓
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/zram1zramctl

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 工作原理

  1. 启动时:从磁盘 /var/log.hdd 恢复到内存 /var/log
  2. 运行时:所有日志写入内存中的 /var/log
  3. 定期同步:通过 cron 或服务将内存日志同步到磁盘
  4. 关机时:将内存日志同步到磁盘保存

常用操作命令

# 手动同步内存日志到磁盘
/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/journalStorage=persistent
volatile仅存储在内存 /run/log/journalStorage=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-256M50M-100M减少写入,保护存储
内存充足256M-512M100M-200M保留更多调试信息
内存紧张64M-128M30M-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. 故障排查命令速查

问题排查命令
无法重置 zramlsof /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/  # 检查备份目录

总结

关键要点

  1. systemd-journald 负责收集日志,armbian-ramlog 负责将日志放入内存
  2. 两者协同工作,保护存储设备,提升性能
  3. 合理配置大小限制是防止内存占满的关键
  4. 定期清理和监控是维护日志健康的重要手段

推荐配置组合

# 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 系统

标签: none

添加新评论