Twemprxy日志切分备份

根据Twemproxy的使用建议,在生产环境下启动debug log并设置log级别为6是值得的。这样会记录每个客户端、服务器连接的生命周期和一些重要事件比如后端服务器从hash环中剔除等。事实上这并不会增加太多运行时负载,只是在记录log时检测一个条件语句的消耗。日志输出格式如下:

对于一个twemproxy访问量超大的应用系统,日志如果不切分必然会导致日志文件很快就变得超大,所以需要考虑每天或每小时对日志文件进行切分备份。

以每天切分一次日志为例,最简单的实现方式是每天凌晨跑一个定时任务的脚本,将nutcracker.log 重命名为nutcracker.log_{前一天日期},比如:mv nutcracker.log nutcracker.log_2014-12-11。但一个问题是Linux进程打开使用一个文件是通过文件描述符直接关联到inode,并不是根据文件名关联,所以重命名文件后并没有改变关联的inode,log还是会被输出到nutcracker.log_2014-12-11文件中。此时可以通过重启服务进程使log输出到指定的nutcracker.log文件,但作为线上访问量超大的服务,通过重启来达到改变log输出文件的方式并不是最好的。

后来联想到nginx是通过外部信号USR1来控制进程重新打开日志文件的,所以我就去查了下twemproxy的源码,它确实也对外部信号进行了处理,能够重新打开日志文件。源码如下:

根据以上源码,twemproxy在接收到HUP信号时会自动重新打开日志文件,所以在mv命令重命名后需要向twemproxy传递HUP信号。日志切分代码如下:

 

Reference:

相关文章: