插件窝 干货文章 Linux Systemd Crontab实例教程:如何定时清理系统日志

Linux Systemd Crontab实例教程:如何定时清理系统日志

清理 日志 logrotate bash 775    来源:    2025-04-11

Linux Systemd Crontab 实例教程:定时清理系统日志

方法一:使用 Systemd Timer 定时清理日志

Systemd 是现代 Linux 系统的标准初始化系统,提供了更强大的定时任务功能。

1. 创建日志清理服务

创建 /etc/systemd/system/clean-logs.service 文件:

[Unit]
Description=Clean system logs

[Service]
Type=oneshot
ExecStart=/usr/bin/find /var/log -type f -name "*.log" -mtime +7 -exec truncate -s 0 {} \;
ExecStart=/usr/bin/find /var/log -type f -name "*.gz" -mtime +30 -delete

2. 创建定时器

创建 /etc/systemd/system/clean-logs.timer 文件:

[Unit]
Description=Run log cleanup daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

3. 启用并启动定时器

sudo systemctl daemon-reload
sudo systemctl enable --now clean-logs.timer

4. 检查定时器状态

systemctl list-timers clean-logs.timer

方法二:使用传统 Crontab 定时清理日志

1. 创建清理脚本

创建 /usr/local/bin/clean-logs.sh 文件:

#!/bin/bash

# 清空7天前的.log文件内容
find /var/log -type f -name "*.log" -mtime +7 -exec truncate -s 0 {} \;

# 删除30天前的压缩日志
find /var/log -type f -name "*.gz" -mtime +30 -delete

# 可选:记录清理操作
logger "System logs cleaned by clean-logs.sh"

赋予执行权限:

sudo chmod +x /usr/local/bin/clean-logs.sh

2. 设置 Crontab 任务

编辑 root 用户的 crontab:

sudo crontab -e

添加以下内容(每天凌晨3点执行):

0 3 * * * /usr/local/bin/clean-logs.sh

3. 验证 crontab

sudo crontab -l

日志轮转替代方案:使用 logrotate

对于更专业的日志管理,可以考虑使用系统自带的 logrotate:

1. 创建自定义 logrotate 配置

创建 /etc/logrotate.d/mycustomlogs 文件:

/var/log/myapp/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 0640 root adm
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

2. 测试配置

sudo logrotate -d /etc/logrotate.d/mycustomlogs

3. 强制立即执行

sudo logrotate -vf /etc/logrotate.d/mycustomlogs

注意事项

  1. 谨慎操作:清理日志前确保这些日志不再需要
  2. 保留关键日志:某些安全或审计日志可能需要保留更长时间
  3. 磁盘空间监控:可以结合磁盘监控工具,在空间不足时触发额外清理
  4. 日志备份:重要日志建议先备份再清理

高级技巧

按日志大小清理

# 清理超过100MB的日志文件
find /var/log -type f -name "*.log" -size +100M -exec truncate -s 0 {} \;

排除特定日志

# 清理但不包括secure日志
find /var/log -type f -name "*.log" ! -name "secure" -mtime +7 -exec truncate -s 0 {} \;

发送清理通知

# 在清理脚本中添加邮件通知
echo "Logs cleaned on $(hostname) at $(date)" | mail -s "Log Cleanup Report" admin@example.com

选择哪种方法取决于您的系统环境和个人偏好。Systemd timer 更适合现代 Linux 系统,而 crontab 则更通用。logrotate 提供了最专业的日志管理功能。