日志轮转之logrotate

      用linux自带的logrotate对进行容器中的nginx日志轮转,发现切割后日志依然往以前的日志中写,后来明白日志的写入是根据inode来进行的,不管日志文件是重命名还是移动位置,都不会对日志的写入造成影响。

一般nginx容器都自带的有nginx日志轮转配置   位置(容器中):/etc/logrotate.d/nginx

/alidata2/nginx/log/*.log {      #此处为需要切割的日志的位置

        daily

        missingok

        rotate 7

        dateext

#        compress

        delaycompress

        notifempty

        create 640 nginx adm

        sharedscripts

        postrotate

                if [ -f /var/run/nginx.pid ]; then

                        kill -USR1 `cat /var/run/nginx.pid`

                fi

        endscript

}

下面是/etc/logrotate.conf配置详解

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

/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进程将立即再次读取其配置并继续运行。注意:这两个关键字必须单独成行。

在 容器中:  /etc/crontab 添加如下内容

59 23 * * *   /usr/sbin/crontab  -f /etc/crontab.d/nginx        #强制执行切割任务

00 00 * * *  kill  -USER $(cat  /var/run/nginx.pid)           #重新打开nginx日志文件,避免日志写入旧log文件。

如果发现计划任务没有执行,可以查看crontab是否启动成功

/etc/init.d/cron status  #查看状态

/etc/init.d/cron start  #启动crontab

容器一般与本地(亚洲上海)相差8小时,所以在本地看到的日志记录的时间会相差8小时,这就需要在容器中更改时间

因为权限问题,正常办法无法更改,在此推荐2种办法:

1、docker cp /etc/localtime    nginx(容器名或者ID):/etc/localtime   #本地时间替换掉容器的时区

2、docker exec -it nginx bash #进入容器

       cd /usr/share/zoneinfo/Asia    #这里有很多时区

       cp  ./Shanghai      /etc/localtime #替换掉原有时区

到此结束。

你可能感兴趣的:(日志轮转之logrotate)