Nginx访问日志切割的三种方法
  

Hacking 5114

{{ttag.title}}
shell 脚本来了

    #/bin/bash
    # author  jiangexing

    set -e   #脚本执行,遇到错就退出,不再往下执行

    sleep 1 # 配合定时任务,0 点过一秒再开始切割任务
    yesterday=$(date -d 'yesterday' +%Y-%m-%d)  #取得服务器当前时间
    ng_logs_dir='/var/log/nginx'  #nginx 日志文件目录

    if [ -d $ng_logs_dir ];then    #判断日志目录是否存在
      cd $ng_logs_dir
      mv access.log  access_${yesterday}.log  #通过 mv 命令将日志移动到分割后的日志,error 日志我一般不做切割
      kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)  #发送 kill -USR1 信号给 Nginx 的主进程号,让 Nginx 重新生成一个新的日志文件
      sleep 1
      tar -czf  access_${yesterday}.log.tar.gz access_${yesterday}.log  #把旧的日志打成压缩包
      rm -f  access_${yesterday}.log  #已有压缩包,删除压缩前的日志
    else
      echo "日志目录不存在,请检查"
      exit 0
    fi

这已经达到了我们想要的效果了,点个赞

当然还有最重要的一步,那就是要做好定时任务

    crontable -l

    0 0 * * *  /usr/local/nginx/scripts/split.sh

2. 使用 logrotate 来实现

这种切割的方法,一开始我是不知道的,因为我之前的 nginx 都是使用源码安装的,在一次偶然的情况下,使用了 yum 安装的方式安装了 nginx,然后发现 nginx 的日志自动切割和压缩了,这就让我要去一探究竟了

后来发现,这个切割功能是由 logrotate 来实现的,接下来我们一起来看看看

如果系统没有安装logrotate 可以使用

sudo yum install logrotate -y

进行安装
配置 logrotate

接下来我们就来配置 nginx 切割的配置文件,我的 nginx 日志路径在/var/log/nginx

我们在 /etc/logrotate.d/ 目录下新建一个 nginx 的文件

    vim nginx

    #########以下为文件配置内容##############
    /var/log/nginx/*log   # 这里也可以写明对具体哪几个文件进行切割
    {
        su root root
        daily
        dateext
        missingok
        rotate 7
        notifempty
        compress
        create 644 www www
        sharedscripts
        postrotate
            [ -f /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        endscript
    }


    # 我们也可以先手 手动执行一下切割试试看看效果
    logrotate -f /etc/logrotate.d/nginx

查看执行后的结果:


没错,这就是我们想要的 ,这种方式和第一种还是比较像的。
logrotate 配置项详解

logrotate 的默认配置文件是 /etc/logrotate.conf。主要参数:

daily–>指定转储周期为每天

weekly–>指定转储周期为每周

monthly–>指定转储周期为每月

dateext–>在文件末尾添加当前日期

compress–>通过 gzip 压缩转储以后的日志

nocompress–>不需要压缩时,用这个参数

copytruncate–>先把日志内容复制到旧日志文件后才清除日志文件内容,可以保证日志记录的连续性

nocopytruncate–>备份日志文件但是不截断

create mode owner group–>转储文件,使用指定的文件模式创建新的日志文件

nocreate–>不建立新的日志文件

delaycompress 和 compress –>一起使用时,转储的日志文件到下一次转储时才压缩

nodelaycompress–>覆盖 delaycompress 选项,转储同时压缩。

errors address–>专储时的错误信息发送到指定的 Email 地址

ifempty–>即使是空文件也转储,这个是 logrotate 的缺省选项。

notifempty–>如果是空文件的话,不转储

mail address–>把转储的日志文件发送到指定的 E-mail 地址

nomail–>转储时不发送日志文件

olddir directory–>转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统

noolddir–>转储后的日志文件和当前日志文件放在同一个目录下

rotate count–>指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份

tabootext [+] list 让 logrotate –> 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~

size–> size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及 KB (sizek)或者 MB (sizem).

prerotate/endscript –>在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行

postrotate/endscript –>在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

3. 高级用法–使用 nginx 本身来实现

当 nginx 在容器里,把 nginx 日志挂载出来的时候,我们发现就不适合再使用 kill -USR1 的方式去分割日志

这时候当然就需要从 nginx 本身配置去解决这个问题了,我们都知道访问日志里面都有一个时间相关的字段,如果我们把这个时间捞出来,这个问题就解决了

在对用的 nginx 配置文件中添加如下配置

         if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})") {
                set $year $1;
                set $month $2;
                set $day $3;
         }
         access_log /var/log/nginx/${year}_${month}_${day}_access.log json;

这个的日志切割可以达到秒级,用法都是一样的,去正则匹配到时间戳就好了。nginx 内置的变量有很多,列如 ${server_name} 这些变量都是可以用来命名日志

当然如果我们需要压缩,就写个对应的定时任务去做压缩就好了

打赏鼓励作者,期待更多好文!

打赏
1人已打赏

飞翔的苹果 发表于 2024-8-9 08:01
  
感谢楼主分享,每日学习打卡
盘藤 发表于 2024-8-21 15:32
  

感谢楼主分享,每日学习打卡.
发表新帖
热门标签
全部标签>
西北区每日一问
技术盲盒
每日一问
技术笔记
干货满满
GIF动图学习
通用技术
标准化排查
SDP百科
产品连连看
技术咨询
技术圆桌
社区新周刊
信服课堂视频
功能体验
2023技术争霸赛专题
秒懂零信任
自助服务平台操作指引
畅聊IT
在线直播
新版本体验
技术晨报
安装部署配置
sangfor周刊
VPN 对接
专家问答
高手请过招
升级&主动服务
答题自测
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
原创分享
解决方案
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
玩转零信任
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
深信服技术支持平台
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
高频问题集锦

本版达人

新手89785...

本周建议达人

YangZhe...

本周分享达人