日志文件自动压缩并邮件发送脚本实现及代码优化咨询
完善日志自动管理脚本
我来帮你修复并优化这个日志脚本,解决原代码里的语法错误和功能缺陷,确保它能稳定完成日志写入、大小监控、压缩归档、邮件发送和日志清空的完整流程。
原代码存在的问题
- 条件判断语法错误:
[" $FILESIZE" -gt "150000"]中,[后和]前必须有空格,否则会触发语法错误 - 邮件发送逻辑错误:原代码的
sendmail用法完全不正确,缺少必要的邮件头(发件人、主题等),且指向了错误的压缩文件名 - 压缩命令冗余:单个文件压缩不需要
-r参数,反而会增加不必要的开销 - 日志写入无时间戳:纯数字日志可读性差,不利于问题排查
- 缺少错误处理和提示:执行过程没有反馈,出问题难以定位
完整优化后的脚本
#!/bin/bash # 配置项:可根据需求修改 LOG_FILE="as.log" # 150KB 转换为字节(1KB=1024字节),原代码用150000,这里用精确值153600 MAX_SIZE=$((150 * 1024)) RECIPIENT_EMAIL="kaanmrzl@gmail.com" SENDER_EMAIL="log-monitor@your-server.com" # 循环写入日志内容 for i in {1..1000} do # 写入带时间戳的日志条目 echo "$(date +"%Y-%m-%d %H:%M:%S") - 日志条目 #$i" >> "$LOG_FILE" # 获取当前日志文件大小 FILESIZE=$(stat -c%s "$LOG_FILE") # 检查是否超过大小阈值 if [ "$FILESIZE" -gt "$MAX_SIZE" ]; then # 生成带精确时间的压缩文件名(避免同一天多次归档重名) ZIP_ARCHIVE="${LOG_FILE}-$(date +"%Y-%m-%d_%H-%M-%S").zip" # 压缩日志文件 if zip "$ZIP_ARCHIVE" "$LOG_FILE"; then echo "成功生成归档文件:$ZIP_ARCHIVE" # 发送归档邮件(包含必要的邮件头) { echo "From: $SENDER_EMAIL" echo "To: $RECIPIENT_EMAIL" echo "Subject: 日志归档通知 - $(date +"%Y-%m-%d %H:%M:%S")" echo "Content-Type: text/plain; charset=utf-8" echo "" echo "日志文件 $LOG_FILE 已达到大小阈值($MAX_SIZE 字节),已自动归档为:" echo "$ZIP_ARCHIVE" echo "" echo "原日志文件已清空,将继续记录新的日志内容。" } | sendmail -t # 清空原日志文件 if truncate -s 0 "$LOG_FILE"; then echo "原日志文件已成功清空" else echo "错误:无法清空日志文件 $LOG_FILE" >&2 fi else echo "错误:无法压缩日志文件到 $ZIP_ARCHIVE" >&2 fi fi # 可选:添加短延迟,模拟真实场景下的日志写入频率(可根据需求调整或删除) sleep 0.1 done
关键改进说明
- 配置项分离:把日志路径、大小阈值、邮箱地址等做成变量,方便后续修改
- 时间戳日志:每条日志添加精确的时间,大幅提升可读性
- 正确的条件判断:修复了
[和]的空格问题,确保语法正确 - 精确归档命名:压缩文件名添加时分秒,避免同一天多次归档出现重名覆盖
- 完善的邮件格式:添加了发件人、主题、字符编码等必要邮件头,确保邮件能正常送达且格式规范
- 错误处理:对压缩和清空操作添加了成功/失败判断,输出提示信息,方便排查问题
- 延迟控制:添加
sleep 0.1避免瞬间写满日志,模拟真实业务场景的日志写入节奏
使用前准备
- 确保系统安装了必要工具:
# Debian/Ubuntu 系统 sudo apt update && sudo apt install zip sendmail # RHEL/CentOS 系统 sudo yum install zip sendmail - 给脚本添加执行权限:
chmod +x log-manager.sh - 配置sendmail:如果是生产环境,需要确保sendmail能连接到SMTP服务器发送邮件;本地测试可配置邮件转发或使用第三方SMTP服务(具体配置可参考系统文档)
内容的提问来源于stack exchange,提问作者Kaan Murzoğlu
相关产品推荐
相关产品推荐

