You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu环境下如何删除Nginx主日志中早于30天的记录?

清理Nginx主日志中30天前记录的Bash方案

当然可以搞定!针对你这种给GoAccess用的不轮转Nginx主日志,要清理30天前记录的需求,这里有几个实用的bash单行命令方案,完美适配Nginx默认的main日志格式:

方案1:用awk精准匹配时间戳(推荐,适用于任何日志顺序)

这个方法会解析每条日志的时间,转换成Unix时间戳后和30天前的时间戳对比,只保留符合要求的记录,不管日志是否按时间排序都能用:

awk -v cutoff=$(date -d '30 days ago' +%s) '{
    split($4, dt, /\[|\/|:| /);
    ts = mktime(dt[3] " " dt[2] " " dt[4] " " dt[5] " " dt[6] " " dt[7]);
    if (ts >= cutoff) print $0
}' /path/to/your/nginx/main.log > /tmp/temp.log && mv /tmp/temp.log /path/to/your/nginx/main.log

细节解释:

  • date -d '30 days ago' +%s:生成30天前的Unix时间戳,作为判断阈值
  • split($4, dt, /\[|\/|:| /):把日志里的时间字段(比如[11/Feb/2018:11:43:10 +0000])拆分成数组,提取出年、月、日、时、分、秒
  • mktime():将提取的时间组件转换成Unix时间戳,和阈值对比,只保留时间戳大于等于阈值的行
  • 用临时文件中转再替换原日志,避免直接修改原文件导致的写入异常

方案2:用sed快速截断日志(适用于按时间顺序写入的日志)

如果你的Nginx日志是严格按时间顺序追加写入的(正常运行的Nginx都是这样),这个方法会更快,直接找到30天前的日期对应的起始行,删除之前的所有内容:

cutoff_date=$(date -d '30 days ago' +'%d/%b/%Y')
sed -i "1,$(grep -n "^.*\[${cutoff_date}" /path/to/your/nginx/main.log | head -n1 | cut -d: -f1)d" /path/to/your/nginx/main.log

注意点:

  • 这个方法依赖日志的时间顺序,如果日志有乱序(比如手动导入旧日志),可能会误删有效记录
  • 相比awk,它不需要把整个日志读入内存,处理超大日志时效率更高

重要提醒

  • 操作前一定要备份原日志:比如执行cp /path/to/your/nginx/main.log /path/to/your/nginx/main.log.bak,避免操作失误丢失数据
  • 可以把命令加到cron里定期自动执行,比如每天凌晨清理一次:
    crontab -e
    # 添加以下一行到crontab文件中
    0 0 * * * awk -v cutoff=$(date -d '30 days ago' +%s) '{split($4, dt, /\[|\/|:| /); ts = mktime(dt[3] " " dt[2] " " dt[4] " " dt[5] " " dt[6] " " dt[7]); if (ts >= cutoff) print $0}' /path/to/your/nginx/main.log > /tmp/temp.log && mv /tmp/temp.log /path/to/your/nginx/main.log
    

内容的提问来源于stack exchange,提问作者Tom Brossman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:44:16