• 烂泥:切割nginx日志


    本文由ilanniweb提供友情赞助,首发于烂泥行天下

    想要获得更多的文章,可以关注我的微信ilanniweb

    这几天自己看了下博客的nginx日志,发现日志文件发现越来越大。

    因为nginx自己不会对日志文件进行切割,所以打算通过其他方式进行切割,而且为了后续能对nginx日志文件里面记录的数据进行分析,所以打算按照天对其进行切割。

    PS:本篇文章所以的操作是在centos6.5 OS 64bit上进行。

    切割nginx日志,我们可以通过两种不同的方式进行,分别是:通过logrotate和通过shell脚本。

    如果是yum方式安装的nginx,系统默认会自动通过logrotate这个日志管理软件,按天进行分割。但是经过多次测试发现logrotate切割日志不会按照自己设置的时间点进行分割,这点有点失望。

    所以无论是yum方式安装,还是源码方式安装,都建议使用shell脚本方式进行切割日志。

    为了更深入的学习linux系统,在此也会介绍下logrotate相关的知识点。

    下面分别对这两种方法进行介绍下:

    一、使用logrotate切割

    前面说了yum或者apt-get方式安装的nginx会自动使用logrotate这个日志管理软件进行切割,所以本章节我们主要介绍有关logrotate相关的知识点。

    1.1 logrotate介绍

    logrotate是什么呢?它是一个linux系统日志的管理工具。它可以切割、压缩等其他软件的日志文件软件。

    logrotate是基于crontab运行的,所以这个时间点是由crontab控制的,具体可以查询crontab的配置文件/etc/anacrontab。

    我们可以通过如下命令安装logrotate,如下:

    yum -y install logrotate

    clip_image001

    如果是ubuntu系统,可以使用如下命令进行安装:

    apt-get -y install logrotate

    clip_image002

    查看logrotate的配置文件,使用如下命令:

    rpm -ql logrotate

    clip_image003

    通过上图,我们可以很明显的看到logrotate的配置文件是/etc/logrotate.conf,而/etc/logrotate.d/是用于存储其他配置文件的目录。该目录里的所有文件都会被主动的读入 /etc/logrotate.conf中执行。

    1.2 logrotate配置文件详解

    logrotate配置选项相对来说比较少,为了切合本篇文章,在此我们以切割nginx的配置文件为例,如下:

    cat /etc/logrotate.d/nginx

    /var/log/nginx/*.log {

    daily

    missingok

    rotate 7

    dateext

    # compress

    delaycompress

    notifempty

    create 640 nginx adm

    sharedscripts

    postrotate

    [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`

    endscript

    }

    clip_image004

    在该配置文件中,每个参数作用如下:

    /var/log/nginx/为nginx日志的存储目录,可以根据实际情况进行修改。

    daily:日志文件将按天轮循。

    weekly:日志文件将按周轮循。

    monthly:日志文件将按月轮循。

    missingok:在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。

    rotate 7:一次存储7个日志文件。对于第8个日志文件,时间最久的那个日志文件将被删除。

    dateext:定义日志文件后缀是日期格式,也就是切割后文件是:xxx.log-20160402.gz这样的格式。如果该参数被注释掉,切割出来是按数字递增,即前面说的 xxx.log-1这种格式。

    compress:在轮循任务完成后,已轮循的归档将使用gzip进行压缩。

    delaycompress:总是与compress选项一起用,delaycompress选项指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行。这在你或任何软件仍然需要读取最新归档时很有用。

    notifempty:如果是空文件的话,不进行转储。

    create 640 nginx adm:以指定的权限和用书属性,创建全新的日志文件,同时logrotate也会重命名原始日志文件。

    postrotate/endscript:在所有其它指令完成后,postrotate和endscript里面指定的命令将被执行。在这种情况下,rsyslogd进程将立即再次读取其配置并继续运行。注意:这两个关键字必须单独成行。

    1.3 查看logrotate默认执行时间

    logrotate切割时间默认是在每天的3:22。这个时间点可以通过crontab配置文件查看到。如下:

    cat /etc/anacrontab

    SHELL=/bin/sh

    PATH=/sbin:/bin:/usr/sbin:/usr/bin

    MAILTO=root

    # the maximal random delay added to the base delay of the jobs

    RANDOM_DELAY=45

    # the jobs will be started during the following hours only

    START_HOURS_RANGE=3-22

    1 5 cron.daily nice run-parts /etc/cron.daily

    7 25 cron.weekly nice run-parts /etc/cron.weekly

    @monthly 45 cron.monthly nice run-parts /etc/cron.monthly

    其中START_HOURS_RANGE参数就是配置logrotate切割的时间点。

    clip_image005

    如果你想在指定时间点,让logrotate切割日志的话,可以修改此配置文件的START_HOURS_RANGE参数。

    但是经过多次实验,我发现logrotate没有按照我指定的时间进行切割日志。

    所以最后我还是选择了使用shell脚本来切割nginx日志。

    二、使用shell脚本切割

    使用shell脚本切割nginx日志很简单,shell脚本内容如下:

    vim /usr/local/cut_del_logs.sh

    #!/bin/bash

    #初始化

    LOGS_PATH=/var/log/nginx

    YESTERDAY=$(date -d "yesterday" +%Y%m%d)

    #按天切割日志

    mv ${LOGS_PATH}/ilanni.com.log ${LOGS_PATH}/ilanni.com_${YESTERDAY}.log

    #向nginx主进程发送USR1信号,重新打开日志文件,否则会继续往mv后的文件写数据的。原因在于:linux系统中,内核是根据文件描述符来找文件的。如果不这样操作导致日志切割失败。

    kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`

    #删除7天前的日志

    cd ${LOGS_PATH}

    find . -mtime +7 -name "*20[1-9][3-9]*" | xargs rm -f

    #或者

    #find . -mtime +7 -name "ilanni.com_*" | xargs rm -f

    exit 0

    clip_image006

    该shell脚本有两个功能,第一个是切割nginx日志,第二个是删除7天之前的nginx日志。

    在切割nginx日志的功能中,我们要注意该shell脚本命名切割的日志是以切割时,是以前一天的时间就行命名该日志文件的。

    所以我们在把该shell脚本放在crontab中执行时,建议在每天的0点0分执行。如下:

    vim /etc/crontab

    0 0 * * * root /bin/sh /usr/local/cut_del_logs.sh

    clip_image007

    查看nginx切割的日志文件,如下:

    ll --full-time /var/log/nginx/

    clip_image008

    通过上图,我们可以很明显的看到,切割shell脚本确实按照我们设想的进行切割和命名切割日志文件的。

  • 相关阅读:
    从错误状态恢复虚拟机
    OpenStack手动从数据库中删除实例
    对于flat_interface与public_interface的理解
    2. 拓扑图
    Cinder相关命令收集
    Nova相关命令收集
    14. Launch an instance
    9. Add the Block Storage service
    8. Add the dashboard
    7. Add a networking service
  • 原文地址:https://www.cnblogs.com/ilanni/p/5365420.html
Copyright © 2020-2023  润新知