logrotate 设计

logrotate 设计


底层的日志分散在三种数据源之上,它们分别是:


1. docker 容器的对应目录,默认在 /var/lib/docker/containers/;


2. kubernetes 的 kubelet 创建的容器对应的目录,默认在 /var/log/containers/,但是它们都是软连接(symbolic link),不会占用磁盘空间,因此可以忽略不计;


3. 各个宿主机操作系统使用systemd管理的进程产生的日志,一般在/var/log/journal/ 或者 /run/log/journal,由 systemd-journald 管理,它本身是一个服务端程序,其客户端就是 journalctl 。





底层的日志汇总在一种数据源之上,它就是日志后端,我们选用 Elasticsearch 。





分散在三种数据源之上的日志由日志代理统一采集,日志代理我们选用Fluentd,最后汇总到日志后端(Elasticsearch)统一存储管理。





可以看出,日志的数据源包括三种分散数据源和一种汇总数据源。





在此基础上,考虑 logrotate 的设计:


1. 分散数据源的第一种,即 docker 容器的对应目录,需要做 rotate ;


实现方案:


第一种,配置 docker 的日志 rotate 规则,即在宿主机操作系统层面解决。具体配置示例如下:

1
2
3
4
5
6
7
{
"log-driver":"json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}


第二种,利用社区提供的针对 docker 的 logrotate 镜像解决,详情见下面的参考资料。


参考资料:


https://blog.csdn.net/qcloudcommunity/article/details/77824015


https://github.com/blacklabelops/logrotate








2. 分散数据源的第三种,即 systemd-journald 管理的日志,需要做 rotate ;


实现方案:配置 systemd-journald 保存的最大日志容量,即在宿主机操作系统层面解决。


参考资料:


https://superuser.com/questions/982620/is-it-safe-to-remove-journal-files-in-centos





3. 汇总数据源,即 Elasticsearch 上的汇总日志,需要做 rotate 。


实现方案:根据要求保留的时间周期,删除不在时间周期内的 Elasticsearch 索引。例如:curl -XDELETE http://10.96.151.162:9200/logstash-2018.07.21