按访问量切割日志需通过监控日志行数实现,核心是统计新增请求达到阈值后触发切割。脚本记录上次行数,累计达10万行时重命名日志文件,发送USR1信号让Nginx重新打开日志,并压缩旧文件。通过crontab每5分钟执行一次,实现自动化切割,适用于需按业务量管理日志的场景。

Linux系统中日志文件会随着时间不断增长,尤其是访问量大的Web服务器,单个日志文件可能迅速膨胀到GB级别,影响系统性能和排查效率。虽然logrotate是标准的日志管理工具,但在某些场景下,比如需要按访问量(如每10万请求)切割日志,就需要通过自定义脚本来实现动态切割。以下是实用的实现方法。
不同于定时切割,按访问量切割依赖对日志内容的实时监控与行数统计。基本逻辑是:
下面是一个基于bash的简单脚本示例,用于按行数(模拟访问量)切割Nginx或Apache的访问日志:
#!/bin/bash
<p>LOG_FILE="/var/log/nginx/access.log"
TEMP_COUNT_FILE="/tmp/access_count"
THRESHOLD=100000 # 每10万请求切割一次
CUT_COUNTER=0</p><h1>初始化计数器</h1><p>if [ -f "$TEMP_COUNT_FILE" ]; then
CUT_COUNTER=$(cat $TEMP_COUNT_FILE)
else
echo "0" > $TEMP_COUNT_FILE
fi</p><h1>统计新增行数</h1><p>CURRENT_LINES=$(wc -l < $LOG_FILE)
if [ $CURRENT_LINES -ge $(( $(echo $CUT<em>COUNTER) + THRESHOLD )) ]; then
TIMESTAMP=$(date +"%Y%m%d</em>%H%M%S")
NEW_LOG_NAME="${LOG<em>FILE%.*}</em>${TIMESTAMP}.log"</p><pre class='brush:php;toolbar:false;'># 切割日志
mv $LOG_FILE $NEW_LOG_NAME
# 重启服务或发送信号清空缓存(Nginx需reload或USR1)
kill -USR1 $(cat /var/run/nginx.pid) 2>/dev/null || systemctl reload nginx >/dev/null 2>&1
# 压缩旧日志
gzip $NEW_LOG_NAME &
# 更新计数器
echo $CURRENT_LINES > $TEMP_COUNT_FILEfi
说明:
将脚本保存为/usr/local/bin/split_log_by_volume.sh,添加可执行权限:
chmod +x /usr/local/bin/split_log_by_volume.sh使用crontab每5分钟检查一次:
*/5 * * * * /usr/local/bin/split_log_by_volume.sh这样系统就会定期判断是否需要切割,实现“准实时”响应访问量增长。
基本上就这些。对于需要按业务量而非时间切割日志的场景,这种脚本方式灵活且可控,适合中小型服务或特定分析需求。不复杂但容易忽略细节,关键是信号触发和权限处理要到位。
以上就是Linux日志怎么切割_Linux日志通过自定义脚本按访问量切割的实用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号