logrotate 在 Nebula Graph 的日志滚动实践

日志切割

日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到。对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题。除此之外,处理一个单个的庞大日志文件也常常是件十分棘手的事。

logrotate 是个十分有用的工具,它可以自动对日志进行截断(或轮转)、压缩以及删除旧的日志文件。例如,你可以设置 logrotate,让 /var/log/foo 日志文件每 30 天轮转,并删除超过 6 个月的日志。配置完后,logrotate 的运作完全自动化,不必进行任何进一步的人为干预。

在 Nebula 中使用 logrotate

安装 logrotate

在 Ubuntu上

sudo apt install logrotate

在 CentOS 上

sudo yum install logrotate

配置 Nebula 服务和 logrotate

每个 Nebula 服务会生成四种日志:INFO、WARNING、ERROR、FATAL。
这里我们以 nebula-graphd 的 /usr/local/nebula/logs/nebula-graphd.INFO日志切割为例说明
在 nebula-graphd.conf 中设置 timestamp_in_logfile_namefalse

--timestamp_in_logfile_name=false

/etc/logrotate.d目录下创建名为 nebula-graphd.INFO 的日志切割配置文件,配置如下:

/usr/local/nebula/logs/nebula-graphd.INFO{
        daily
        rotate 5 
        copytruncate
        nocompress
        missingok
        notifempty
        create 644 root root
        maxsize 500m
}

参数说明:

  • daily:日志文件将按天轮循。其它可用值为’daily’,‘weekly’或者’yearly’。
  • rotate 5:一次将存储 5 个归档日志。对于第六个归档,时间最久的归档将被删除。
  • copytruncate:配置 copytruncate 后如果 crontab 中定时运行 lograte 时满足 rotate 条件的话,将拷贝原来的 nebula-graphd.INFO 为 nebula-graphd.INFO.1,而 nebula-graphd.INFO 本身会清空,新日志写在 nebula-graphd.INFO 里。
  • nocompress:在轮循任务完成后,已轮循的归档将不使用 gzip 进行压缩。
  • missingok:在日志轮循期间,任何错误将被忽略,例如“文件无法找到”之类的错误。notifempty如果日志文件为空,轮循不会进行。
  • create 644 root:root以指定的权限创建全新的日志文件,同时 logrotate 也会重命名原始日志文件。
  • maxsize 500m:当日志超过指定的大小时或者超过设定的周期如 daily 时转储,bytes(缺省)及 KB(sizek)或MB(sizem),注意:不可配置超过 1500 m,因为 glog 不指定日志大小时,默认最大 1800 m 切割。

logrotate 定时任务

安装 logrotate 后,logrotate 默认会定时每天跑一次,比如在 Ubuntu 上会有 /etc/cron.daily/logrotate 的定时任务脚本。如果日志增长过快,可以增加 crontab 任务来尽早发现 log size 超过 maxsize 的情况,在 Ubuntu 上可以通过增加每分钟都跑一次的 logrotate 定时任务,通过编辑 /etc/crontab,增加一行:

 *  *    * * *   root    /etc/cron.daily/logrotate

以上为本次 logrotate 分享。