序言
每年都要买衣服,有的衣服旧了,有的衣服破了,所以总是要将旧衣服放在一边,进行归档,新的衣服放在一边,是正在使用的。
在生成环境中,一个应用程序只要接受到请求就会产生日志,例如nginx会产生访问日志,错误日志,而如果日志都卸载一个文件中,那么日积月累,占用的磁盘空间也越来越多,从而就需要日志轮替。将老的日志进行归档压缩,并且限定总的日志空间大小,从而防止磁盘使用率满而无法定位问题。
logrotate介绍
在linux系统中,其实已经自带了日志轮替的软件,那就是logrotate,而系统的日志文件都是使用这个进行轮替,从而在/var/log中,有各种带有后缀的日志文件。
而这个实现的软件就是logrotate,主要是用来进行日志的归档工具之一。
配置文件所在的目录如上所示,要想强制生效,那么可以执行如下指令(加参数-v主要显示过程的详细信息,-f表示强制):
参数的大概意思是,每周进行一次归档,保留的日志文件个数为10个,先拷贝,然后清空日志,这种会丢失部分日志,归档之后压缩,空不进行归档。
日志归档原理
在进行日志归档的时候,总是想着日志会有部分的丢失,WHY?
当进行日志轮替的时候,日志文件正在使用中,程序会不停的朝着日志文件写入日志信息,这个时候,直接将日志文件mv重名名进行归档,然后创建一个新文件,重启进程或者重新加载配置文件,那么中间必定有一个中断的时间,这个日志会丢失么?
并不会,当程序写入文件的时候,其实使用的inode号,而不是文件名称,当你mv的时候,文件的inode号并不会发生改变,从而还是将相关的日志文件写到此文件中;当你再次重启或者重载的时候,那么新的日志就会写入到新的文件中,从而不会丢失日志。。。其实这也就是logrotate中的create方式。
那么上面一种是不丢失日志,其中,还有一种就是丢失日志的方式,那就copytruncate,这种主要的使用场景就是应用程序能接受丢失部分的日志,主要的原因是应用程序不能接受重新加载日志文件的方式,从而需要丢失。
而这种轮替的逻辑是,首先将当前的日志cp一份作为备份轮替,然后将当前的日志进行truncate,从而达到轮替的目的。
而再次考虑一种场景。。。电商站点进行大促,在大促期间,日志的增长,总共的磁盘空间就40G,而日志的增长十几分钟就1G了怎么办,轮替?一个日志也很大很大。。。那么就要考虑另外的一种方案,除了正常的轮替之外,还需要一个根据日志文件的大小来进行判断的,例如设置为512M,如果文件到了512M,那么就进行一次轮替,进行压缩,然后归档,从而也就有了参数size来设定每个文件的大小。
容器的日志归档:
在docker中,每个容器都有自己的日志,默认的驱动是json-file,也就是将日志保存在一个json文件中,那么如果请求过大,这个容器的日志空间会大大的占用宿主机的磁盘空间,从而需要设定日志参数--log-opt max-file=4 --log-opt max-size 25m,也就是从两个纬度来限定此容器的日志大小,从而最大也就使用100M的空间。
这个设置是全局设置,也就是直接怼dockerd设置,设置后对所有的容器都生效。
容器也需要日志的轮替,不然。。。磁盘空间也扛不住。
——NAN