答案:通过Shell脚本监控内存使用率,超过阈值时切割日志。脚本检查内存 usage,若超设定值且日志存在,则移动归档并记录操作,结合cron定期执行,需注意权限、服务兼容性及保留策略。

Linux系统中日志文件会随着时间不断增长,占用大量磁盘空间甚至影响系统性能。虽然logrotate是常用的日志切割工具,但有时需要根据特定条件(如内存使用率)进行自定义切割。下面介绍如何通过自定义Shell脚本实现按内存使用情况对日志进行切割。
监控内存使用并触发日志切割
核心思路是编写一个定时运行的Shell脚本,实时检查系统内存使用率,当超过设定阈值时,自动对指定日志文件进行切割归档。
以下是一个实用示例脚本:
#!/bin/bash配置参数
LOG_FILE="/var/log/app.log" MAX_MEMORY_USAGE=80 # 内存使用率阈值(百分比) ARCHIVE_DIR="/var/log/archive" CURRENTDATE=$(date +"%Y%m%d%H%M%S")
创建归档目录
[ ! -d "$ARCHIVE_DIR" ] && mkdir -p "$ARCHIVE_DIR"
获取当前内存使用率(去掉%符号)
MEMORY_USAGE=$(free | grep Mem | awk '{print ($3/$2) * 100}' | cut -d. -f1)
判断是否超过阈值且原日志文件存在且非空
if [ $MEMORY_USAGE -gt $MAX_MEMORY_USAGE ] && [ -f "$LOG_FILE" ] && [ -s "$LOG_FILE" ]; then mv "$LOG_FILE" "$ARCHIVE_DIR/app.log.$CURRENT_DATE" echo "日志已切割: $LOG_FILE → $ARCHIVE_DIR/app.log.$CURRENT_DATE (内存使用: ${MEMORY_USAGE}%)"
可选:发送通知或记录操作
logger "Log rotated due to high memory usage: ${MEMORY_USAGE}%"fi
将脚本加入定时任务
为了让脚本能周期性运行,需将其添加到crontab中。
编辑root用户的定时任务:
crontab -e添加如下行(每5分钟检查一次):
*/5 * * * * /path/to/your/log_rotate_script.sh确保脚本有可执行权限:
chmod +x /path/to/your/log_rotate_script.sh注意事项与优化建议
实际部署时需考虑以下几个关键点:
- 避免频繁切割:高内存可能持续存在,建议增加冷却机制(如记录上次切割时间)防止短时间内重复操作。
-
保留策略:定期清理旧归档日志,可用find命令配合cron删除超过N天的日志:
find /var/log/archive -name "app.log.*" -mtime +7 -delete - 日志重建:某些服务在日志被移走后不会自动创建新文件,可在脚本末尾追加touch "$LOG_FILE"或重启对应服务。
- 权限问题:确保运行脚本的用户对日志文件和归档目录有读写权限。
基本上就这些。通过结合内存监控与条件判断,你可以灵活控制日志切割时机,尤其适用于资源敏感型环境。不复杂但容易忽略细节,比如磁盘空间、服务兼容性和异常处理。










