Linux定时任务实战:自动化清理/var/log/journal日志文件

张开发
2026/4/17 23:59:33 15 分钟阅读

分享文章

Linux定时任务实战:自动化清理/var/log/journal日志文件
1. 为什么需要定期清理journal日志每次打开Linux系统的/var/log/journal目录看到那些不断膨胀的日志文件我就想起自己第一次被日志撑爆磁盘的惨痛经历。那天凌晨三点监控系统疯狂报警服务器磁盘使用率100%网站直接瘫痪。排查后发现是journal日志半年没清理足足吃掉了40G空间。systemd的journal日志系统确实好用它能记录内核、系统服务和应用的各种运行日志。但默认配置下这些日志会无限累积就像家里从不收拾的储物间时间一长就会变成灾难。我后来发现journalctl其实自带了日志清理功能只是需要手动执行。对于生产环境来说自动化才是王道。日志无节制增长的危害很明显占用宝贵磁盘空间影响系统性能严重时甚至导致服务崩溃。更麻烦的是当真的需要查日志时海量的数据反而让问题定位变得困难。这就是为什么我们需要给journal日志上个自动清理的闹钟。2. 手动清理vs自动清理的实测对比先带大家快速体验下journalctl的清理功能。假设我们要将日志限制在100M以内只需执行journalctl --vacuum-size100M这个命令会删除最旧的日志直到总大小小于100M。但就像原始文章提到的这只是一次性操作。我做过测试在日志量大的服务器上手动执行后日志体积从2.3G降到98M但一周后就又涨到1.8G。更智能的做法是用crontab设置定时任务。比如每小时检查一次就像给日志装了自动调节阀。实测对比显示手动清理磁盘使用率波动剧烈可能突然报警自动清理磁盘使用率始终平稳维持在设定阈值以下下表是两种方式的详细对比对比项手动清理自动清理磁盘空间利用率波动大可能突然爆满稳定在设定阈值附近运维工作量需要人工干预设置后无需操心风险系数可能忘记导致故障基本杜绝日志导致的故障适用场景临时维护生产环境长期运行3. 手把手编写自动清理脚本现在进入实战环节我会分享自己优化过的清理脚本。首先创建脚本目录避免污染系统路径mkdir -p /opt/scripts/journal_cleaner接着创建清理脚本#!/bin/bash # 设置日志最大为100M MAX_SIZE100M echo $(date %Y-%m-%d %H:%M:%S) - 开始清理journal日志 /var/log/journal_clean.log journalctl --vacuum-size$MAX_SIZE 21 | tee -a /var/log/journal_clean.log echo $(date %Y-%m-%d %H:%M:%S) - 清理完成 /var/log/journal_clean.log这个脚本有几个改进点添加了详细的时间戳日志方便后续排查使用tee命令同时输出到屏幕和日志文件错误输出重定向到日志文件(21)给脚本执行权限chmod x /opt/scripts/journal_cleaner/clean_journal.sh可以先用-d参数测试脚本是否正常bash -x /opt/scripts/journal_cleaner/clean_journal.sh4. 配置crontab定时任务的技巧定时任务配置看似简单但实际踩过不少坑。先说基本配置crontab -e添加以下内容每小时的第5分钟执行5 * * * * /opt/scripts/journal_cleaner/clean_journal.sh保存后系统会自动安装这个crontab。但有几个关键点需要注意环境变量问题cron执行环境与shell不同建议在脚本中显式设置PATH#!/bin/bash PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin权限问题普通用户的cron可能没有权限操作systemd日志建议用root配置sudo crontab -e日志轮转清理脚本自身的日志也要管理可以用logrotate配置/var/log/journal_clean.log { daily rotate 7 missingok notifempty compress }邮件通知cron默认会发邮件报告错误如果服务器没配邮件服务可以在crontab开头加MAILTO5. 高级配置与疑难排查对于特别繁忙的系统可能需要更精细的控制。比如只保留最近7天的日志journalctl --vacuum-time7d也可以组合使用时间和大小限制journalctl --vacuum-size500M --vacuum-time14d常见问题排查脚本不执行检查cron服务是否运行systemctl status cron权限不足查看/var/log/journal目录权限ls -ld /var/log/journal日志没变化手动执行脚本看输出/opt/scripts/journal_cleaner/clean_journal.sh磁盘仍不足检查是否是其他日志文件占用空间du -sh /var/log/*对于关键业务系统我建议在非高峰时段执行清理比如凌晨3点0 3 * * * /opt/scripts/journal_cleaner/clean_journal.sh还可以添加监控当清理失败时触发告警。比如在Prometheus中添加如下监控项- name: journal_clean_status rules: - alert: JournalCleanFailed expr: time() - file_mtime(/var/log/journal_clean.log) 86400 for: 1h labels: severity: warning annotations: summary: Journal日志清理失败超过24小时

更多文章