您的位置:首页 > 运维架构 > Nginx

nginx日志切割工具logrotate若干问题

2017-03-07 00:00 766 查看
logrotate默认的切分方式:

1.create方式:重命名原日志文件,创建新的日志文件。

a.重命名当前程序正在输出的日志的名称。因为重新命名只会修改目录文件的内容,而进程操作文件靠的是inode编号,所以不影响程序继续输出日志。

例如:原本日志文件nginx_a.log, nginx向nginx_a.log写入日志,把nginx_a.log重新命名为nginx_b.log,这个时候就想nginx_b.log写入日志,两者的inode如下所示:

root@ubuntu:/tmp# stat nginx_a.log
File: ‘nginx_a.log’
Size: 360 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1175153 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-12-30 11:47:53.435271360 +0800
Modify: 2016-12-30 11:48:00.455328512 +0800
Change: 2016-12-30 11:48:00.455328512 +0800
Birth: -

nginx@ubuntu:/tmp$ stat nginx_b.log
File: ‘nginx_b.log’
Size: 2500 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1175153 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-12-30 11:49:39.573216807 +0800
Modify: 2016-12-30 11:49:47.581329002 +0800
Change: 2016-12-30 11:49:47.581329002 +0800
Birth: -

从上面的信息可以看出,虽然是重命名了,但是两个文件使用都是同一个inode,nginx使用inode来写入日志信息

b.创建新的日志文件,名字和原来的日志文件的名称相同。虽然新的文件的名称和原来的文件的名字相同,但是inode编号不同,所以程序的输出还是到原来的日志文件。

重新创建nginx_a.log文件,inode信息如下所示:

nginx@ubuntu:/tmp$ stat nginx_a.log
File: ‘nginx_a.log’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 1175164 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ nginx) Gid: ( 1000/ nginx)
Access: 2016-12-30 11:56:29.570152511 +0800
Modify: 2016-12-30 11:56:29.570152511 +0800
Change: 2016-12-30 11:56:29.570152511 +0800
Birth: -

通过上述的信息,可以发现虽然是和之前文件的名称相同都是nginx_a.log,但是已经是不同的inode

c.通过某种方式通知原来的程序,重新启动打开日志文件。程序重新打开日志文件,靠的是文件路径而不是inode编号,所以重新打开的就是新的日志文件

nginx重新加载配置文件 nginx -s reload 或者 kill -HUP $nginx_pid,这个时候就重新使用nginx_a.log文件,也就是继续往nginx_a.log写日志了。

nginx提供了重新生成日志文件的方式:kill -USR1 $nginx_pid

2.copytrucate方式:用于还在打开中的日志文件,将当前的日志文件备份并且截断,该种方式有可能会丢失部分的日志
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息