服务器运维:怎样优雅地切割log

好吧,我必须要承认,我是一个标题党来的。本文英文名称意思比较准确。什么?你没看到英文名称在哪?不是写给你看的,你当然看不到。

在Web开发过程中,你总是因为各种理由,需要跟服务器打交道,因为各种理由需要承担一点点运维工作,哪怕你需要运维自己的blog,比如用Linode这种东西。那么服务器运行,就少不了log,log不少,就不得不翻滚,就是rotate,不知道中文是啥……

为什么要rotate呢,理由是比较简单的,比如在32位系统里,默认文件写到2G大小的时候,就会导致进程core掉,引发很多神奇的问题和bug,你也可以用一些补丁和编程技巧突破2G这个限制,但是你真的需要一个超过2G的log么?回溯总归不方便吧,按日期检索总归不方便吧,反正理由很多了,就是一定要rotate的。

怎么rotate呢,这个方法可就多了。最傻逼的一种,每次想起来了,ssh到服务器,将所有log都mv一遍,啥?mv后进程挂了,重启不就行了。太多了?mv ./* 嘛,啥?机器挂了,谁让你选这么煞笔的方式啊……

然后稍微优雅点的,会写个shell脚本。以前我所在的团队,就有人这么干,写个shell脚本,然后放个cron,就比较省心了。那么shell脚本怎么rotate呢,还不是mv么……mv有问题的,因为有些log文件的句柄开着的,突然mv掉了,就好像行驶中的汽车轮子突然掉了,你说啥感觉呢……比较温柔的是 echo ‘’ > xxxx.log,我管这个叫写空,先cp,然后写空,会比较温柔。

然后说到比较干货的地方了。就是有个东西叫logrotate,以前我根本不知道,我以为用shell脚本就高大上了,草。原来有专门的程序,好的系统,就是从中能学到很多井井有条可以喝咖啡的技巧,比如debian就是这样的系统。那些脏呼呼的服务器程序,脏兮兮的配置文件,放在随便哪个脏兮兮的目录都是可以的,垃圾的文章会告诉你怎么配置就行了。然后你打开debian的时候,你会发现这些配置文件都这么整齐,都这么自动,可以分头安装,还能安全卸载,后装的竟然能跟先装好的完美契合,简直绝了。

跑题了。这个logrotate,就是专门切割log的,通过一个配置文件来控制切割频率,切割大小,是否压缩,多少天删除等等,什么都想好了,写什么shell脚本啊,简直浪费时间。

按照一般的教程,如果你配置好logrotate,那也就太平了,一天切一次,30天循环。草,这也会出问题的,比如你的服务器访问量很恐怖,每天产生10G的access_log的话,你就知道了,切割的时候,切完了压缩的时候,你会发现(没有报警系统的话,你还发现不了)CPU被占满了,这意味访问受阻么?也不一定,只是一两个核被占满了而已。当然,每个核其实是不一样的,改天说。所以某几个核占满了,也是不行的。

写到这里我就写不动了,累啊,直接干货吧。

准备log方案的时候:

  1. log存在哪个磁盘上?如果分区了的话,要选最大的那个区
  2. log每天产生多少?有个估算没有,没有的话,就观察出来
  3. 在服务器本地磁盘能暂存多少天?压缩后能暂存多少天?
  4. 压缩很耗费CPU时间的,想好log是否压缩?
  5. log是否很重要?那就需要一个大存储专门存放log的,不然rotate没几天,前面的就丢了;
  6. 如果单日切割太大了,可以按照文件大小切割的,或者按照小时切割;
  7. 怕耗CPU可以先不压缩的;
  8. 想压缩的话,可以用taskset和nice指令的,让CPU不要被gzip跑满;