zoukankan      html  css  js  c++  java
  • 烂泥:切割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脚本确实按照我们设想的进行切割和命名切割日志文件的。

  • 相关阅读:
    LeetCode 252. Meeting Rooms
    LeetCode 161. One Edit Distance
    LeetCode 156. Binary Tree Upside Down
    LeetCode 173. Binary Search Tree Iterator
    LeetCode 285. Inorder Successor in BST
    LeetCode 305. Number of Islands II
    LeetCode 272. Closest Binary Search Tree Value II
    LeetCode 270. Closest Binary Search Tree Value
    LeetCode 329. Longest Increasing Path in a Matrix
    LintCode Subtree
  • 原文地址:https://www.cnblogs.com/ilanni/p/5365420.html
Copyright © 2011-2022 走看看