用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 #替换掉原有时区
到此结束。