You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

技术问询:如何按每10K行压缩log1.log并限制其大小不超限

解决方案:自动轮转并压缩日志文件,控制大小

Hey Abhay, I've got a couple of solid solutions for your problem—both will let you keep your log file from growing indefinitely, rotate it every 10k lines, and make sure no data gets lost. Let's dive in:

方案1:使用logrotate(推荐,系统原生工具)

logrotate是类Unix系统上管理日志的标准工具,能完美处理日志轮转、压缩,还能保证你的脚本持续写入正确的文件,不会中断。

步骤1:创建logrotate配置文件

新建一个配置文件(比如~/log1_rotate.conf),写入以下内容:

/path/to/your/log1.log {
    rotate 10    # 最多保留10个轮转后的日志文件(可按需调整)
    copytruncate # 先复制当前日志到新文件,再截断原文件(核心:保证脚本不中断写入)
    compress     # 自动压缩轮转后的日志
    delaycompress # 延迟一轮再压缩,避免正在写入的文件被干扰
}

因为logrotate原生不支持按行数触发轮转,我们需要配合定时任务来检查行数,达到阈值就触发轮转。

步骤2:设置定时任务(cron)

添加一个每分钟执行一次的cron任务(可根据日志增长速度调整频率):

* * * * * /bin/bash -c 'if [ $(wc -l < /path/to/your/log1.log) -ge 10000 ]; then /usr/sbin/logrotate -f ~/log1_rotate.conf; fi'

copytruncate是关键:它先复制日志内容,再截断原文件,你的脚本全程都在往log1.log写,完全不会丢数据。

方案2:自定义监控脚本(手动控制)

如果你不想依赖系统工具,也可以写个简单的脚本监控日志行数,达到阈值就自动轮转压缩。

步骤1:修改你的原始脚本

先给script.sh加一段信号处理逻辑,让它收到信号后能重新打开日志文件。在脚本开头添加:

# 捕获USR1信号,重新将标准输出定向到log1.log
trap 'exec > log1.log' USR1

这样当我们给脚本发送USR1信号时,它会自动切换输出到新的log1.log文件。

步骤2:创建监控脚本(log_monitor.sh

#!/bin/bash
LOG_FILE="/path/to/your/log1.log"
MAX_LINES=10000

while true; do
    # 获取当前日志行数
    CURRENT_LINES=$(wc -l < "$LOG_FILE")
    
    if [ "$CURRENT_LINES" -ge "$MAX_LINES" ]; then
        # 生成带时间戳的轮转日志文件名
        TIMESTAMP=$(date +%Y%m%d_%H%M%S)
        ROTATED_LOG="${LOG_FILE%.log}_$TIMESTAMP.log"
        
        # 原子重命名当前日志(脚本会暂时继续往重命名后的文件写)
        mv "$LOG_FILE" "$ROTATED_LOG"
        
        # 给原始脚本发送USR1信号,让它重新打开新的log1.log
        SCRIPT_PID=$(pgrep -f "sh script.sh") # 如果脚本有唯一名称,可调整这里的匹配规则
        kill -USR1 "$SCRIPT_PID"
        
        # 压缩轮转后的日志(也可以用xz等其他压缩工具)
        gzip "$ROTATED_LOG"
        
        echo "已轮转日志到 $ROTATED_LOG.gz,时间:$(date)"
    fi
    
    # 每30秒检查一次(可根据日志增长速度调整)
    sleep 30
done

步骤3:启动监控脚本

先给脚本加执行权限,再后台运行:

chmod +x log_monitor.sh
./log_monitor.sh > monitor.log &

然后继续按原来的方式运行你的业务脚本:

sh script.sh > log1.log &

关键注意事项

  • 无数据丢失: 两种方案都保证了脚本不会停止写入——logrotatecopytruncate,以及自定义脚本里的mv + kill -USR1组合,都能避免数据丢失。
  • 压缩时机: 自定义脚本里我们在轮转完成后再压缩,确保所有写入旧日志的操作都已完成。
  • 调整频率: 可以根据日志增长速度,修改cron的执行间隔或监控脚本里的sleep时间。

内容的提问来源于stack exchange,提问作者Anand Abhay

火山引擎 最新活动