• nginx 的访问日志切割


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

    当 nginx 在容器里,把 nginx 日志挂载出来的时候,我们发现就不适合再使用 kill -USR1 的方式去分割日志
    这时候当然就需要从 nginx 本身配置去解决这个问题了,我们都知道访问日志里面都有一个时间相关的字段,如果我们把这个时间捞出来,这个问题就解决了
    我们来看按天生成访问日志

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

    查看日志生成的结果
    nginx-5
    看到日志已经按照我们的需求切割出来了,这个的日志切割可以达到秒级,用法都是一样的,去正则匹配到时间戳就好了。nginx 内置的变量有很多,列如 ${server_name} 这些变量都是可以用来命名日志
    当然如果我们需要压缩,就写个对应的定时任务去做压缩就好了,

    if ($time_iso8601 ~ "^(d{4})-(d{2})-(d{2})") {
                set $year $1;
                set $month $2;
                set $day $3;
            }
            access_log  logs/django.${year}_${month}_${day}_access.log  main;

    2. 使用 shell 脚本实现

    首先来看我的访问日志是没有做任何切割的
    nginx-1
    接下来,很简单,shell 脚本来了

    1. #/bin/bash
    2. # author jiangexing
    3.  
    4. set-e #脚本执行,遇到错就退出,不再往下执行
    5.  
    6. sleep 1# 配合定时任务,0 点过一秒再开始切割任务
    7. yesterday=$(date -d 'yesterday'+%Y-%m-%d)#取得服务器当前时间
    8. ng_logs_dir='/var/log/nginx'#nginx 日志文件目录
    9.  
    10. if[-d $ng_logs_dir ];then#判断日志目录是否存在
    11. cd $ng_logs_dir
    12. mv access.log access_${yesterday}.log #通过 mv 命令将日志移动到分割后的日志,error 日志我一般不做切割
    13. kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)#发送 kill -USR1 信号给 Nginx 的主进程号,让 Nginx 重新生成一个新的日志文件
    14. sleep 1
    15. tar -czf access_${yesterday}.log.tar.gz access_${yesterday}.log #把旧的日志打成压缩包
    16. rm -f access_${yesterday}.log #已有压缩包,删除压缩前的日志
    17. else
    18. echo "日志目录不存在,请检查"
    19. exit0
    20. fi

    S
    我们可以先来手动执行一下脚本看一下效果
    nginx-2
    这已经达到了我们想要的效果了,点个赞

    当然还有最重要的一步,那就是要做好定时任务
    1. 00***/usr/local/nginx/scripts/split.sh

    3. 使用 logrotate 来实现

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

    3.1 查看系统是否已经安装了 logrotate

    nginx-3
    如上图红框框中,如果 base 前面有个@符号,就表示这个软件已经安装,当然这个只是众多检查方法之一
    如果没有安装就安装一下

    1. yum install logrotate -y

    安装完成后,自动在/etc/cron.daily/下生成个 logrotate 可执行的脚本文件,此脚本每天都会执行一次

    3.2 配置 logrotate

    接下来我们就来配置 nginx 切割的配置文件,我的 nginx 日志路径在/var/log/nginx
    我们在 /etc/logrotate.d/ 目录下新建一个 nginx 的文件

    1. vim nginx
    2.  
    3. #########以下为文件配置内容##############
    4. /var/log/nginx/*log # 这里也可以写明对具体哪几个文件进行切割
    5. {
    6. su root root
    7. daily
    8. dateext
    9. missingok
    10. rotate 7
    11. notifempty
    12. compress
    13. create 644 www www
    14. sharedscripts
    15. postrotate
    16. [ -f /usr/local/nginx/logs/nginx.pid ] && kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
    17. endscript
    18. }

    我们也可以先手 手动执行一下切割试试看看效果

    1. logrotate -f /etc/logrotate.d/nginx

    看一下执行之后的结果是不是我们想要的
    nginx-4
    没错,这就是我们想要的 :idea: ,这种方式和第一种还是比较像的。

    3.3logrotate 配置项详解

    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 –>在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

  • 相关阅读:
    IDEA系列(七)--给自己的IDEA一个酷炫的主题吧
    Swagger入参为List
    Mac系统 JDK版本切换
    equals方法被调用时字符串和对象的顺序
    MongoDB简介
    2018-5-18 东方微银Java笔试题
    Java基本数据类型之char
    Java实例——简单的汽车销售4S店
    Java实例——格式化当前日期
    Java实例——为新员工分配部门
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/13924732.html
Copyright © 2020-2023  润新知