在docker的alpine环境下使用crond,logrotate,syslogd来管理日志
我们在架构时,会需要记录各种日志。Linux下面提供了crond,logrotate和syslogd这三个工具来完成这个任务,使用起来,比手写的解决方案要方便并且成熟得多。
其中:
- crond是定时执行任务的服务
- logrorate可以把过大的文件给截断,保存成带时间戳的文件,防止日志文件无限制地扩大
- syslogd是标准化的写日志工具,会统一把日志输出到配置的地方去。
因此上面三个工具整合起来就形成了一个完整的记录日志的方案:
- 通过syslogd来标准化地写日志.
- 使用logrotate来定期滚动截断保存通过syslogd所产生的日志
- 使用crond来定时执行logroate
本文通过使用docker的alpine linux环境来介绍这三个工具的整合使用方式。
启动并运行容器
首先是启动基于alpine linux的容器:
$ docker run -it alpine sh
安装并使用logrotate
安装logrotate使用下面命令:
$ apk add logrotate
安装过程及结果如下:
/ # apk add logrotate
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
(1/2) Installing popt (1.16-r7)
(2/2) Installing logrotate (3.15.0-r0)
Executing busybox-1.29.3-r10.trigger
OK: 6 MiB in 16 packages
/ #
安装完成后会提供一个logrotate的命令:
$ which logrotate
/usr/sbin/logrotate
这个命令会根据提供的配置文件执行文件的rotate工作。默认的配置文件为/etc/logrotate.conf。可以看下配置文件的内容:

上面的配置文件里面定义了几样东西:
- rotate的频率为weekly
- 保留的rotate文件数为4
- 使用压缩包的形式保存rotate文件(compress)
- 待rotate的文件为/var/log/messages
这样,当我们执行logrotate并使用上面的配置文件,运行命令为:
/usr/sbin/logrotate /etc/logrotate.conf
这样logrotate就会根据配置,把目标文件rotate成一系列的文件。下面是例子:

可以看到我的系统上的system.log文件会按照配置被rotate。
以上是logrotate的基本使用方法。有了这个logrotate命令,还需要定时执行它才行,否则整个机制无法工作。定时执行的工具就是crond这个服务程序。
crond
crond在alpine linux环境里是默认安装好的,可以使用crontab命令来查看定时任务的设置:
/ # crontab -l
# do daily/weekly/monthly maintenance
# min	hour	day	month	weekday	command
*/15	*	*	*	*	run-parts /etc/periodic/15min
0	*	*	*	*	run-parts /etc/periodic/hourly
0	2	*	*	*	run-parts /etc/periodic/daily
0	3	*	*	6	run-parts /etc/periodic/weekly
0	5	1	*	*	run-parts /etc/periodic/monthly
如上所示,可以看到crond已经定义了系统中的几个定时目录,分别对应hourly,daily,weekly和monthly这样的频次。
此外,上面的配置当中run-parts是一个可执行脚本,这个脚本可以把某一个目录内所有的可执行文件都执行一遍,所以上面的命令就对应着把相关目录里面的可执行文件执行一遍。
然后类似*/15 * * * *这样的东西,是设置真正的定时时间。crond的这个设置定时的语法格式所对应的含义,可以用这个在线工具来解释:
比如我们把*/15 * * * *输入进这个网站:

就可以看到它所对应的定时频率。
我们可以用用看crond。首先创建一个新的目录叫1min:
$ mkdir -p /etc/periodic/1min
这个项目用来放需要每分钟执行一次的脚本或程序。然后我们使用crontab明令来编辑crond服务的配置文件:
$ crontab -e
上面的命令会打开cron的配置文件:

如上所示,我们打开了配置文件的编辑界面,此时我们往里面添加一条配置:

上面这条配置就是将刚刚建立的1min目录定义为每分钟扫描并用run-parts把里面的可执行脚本或程序跑一遍。
配置定时任务的时候,可以在crontab.guru这个网站里验证我们写的定时规则是我们想要的:

配置好crontab以后,我们查看一下规则:
$ crontab -l

可以看到此时新添加的这条规则已经生效了。接下来可以向1min这个目录里添加一个脚本:
$ cat <<EOF > /etc/periodic/1min/foo
> #!/bin/sh
> echo "Hello, world"
> EOF
添加完成后,把foo的属性改为可执行:
$ chmod a+x /etc/periodic/1min/foo
此时查看文件并执行试试看:
$ ls /etc/periodic/1min/foo
/etc/periodic/1min/foo
$ /etc/periodic/1min/foo
Hello, world
我们使用run-parts手工执行一下/etc/periodic/1min/里面的脚本:
$ run-parts /etc/periodic/1min
Hello, world
可以看到1min目录里的foo脚本被run-parts执行了。
以上是一个手工的验证过程,接下来就是要使用crond来定时执行我们的脚本。此时启动crond服务:
$ crond
$ crond[28]: crond (busybox 1.28.4) started, log level 8
等待一段时间,会看到crond去触发定时任务:

理解了crond的工作原理,接下来看看logrotate是如何使用crond的。
logrotate对crond的使用
logrotate对crond的使用很直接,它会在daily目录里放一个logrotate脚本:
$ ls /etc/periodic/daily
logrotate
脚本内容如下:

因为上面这个脚本放在/etc/periodic/daily目录里,所以如果启动crond定时服务的话,上面的这个脚本就会每天执行一次。
从上面的脚本文件里可以看到,它的核心逻辑是这行:
$ /usr/sbin/logrotate /etc/logrotate.conf
所以crond和logrotate的默认整合方式就是:
- logrotate通过- crond来每天定时执行一次
在上面的分析当中,我们已经看过logrotate.conf的配置内容,其中需要注意的是logrotate.conf里面的这一行:

在上面的配置里,可以看到logrotate默认会rotate的日志文件是/var/log/messages这个文件。
那么这个文件是哪里来的呢?是从syslogd来的。接下来讲讲syslogd。
使用syslogd记录日志
syslogd是一个记日志的服务工具。使用syslogd的好处是,它可以提供一个统一的日志记录接口。
举个例子,比如我们自己写一个脚本,要记录日志,可能会首先一个bash命令,往某一个文件里输出日志内容,可能会这样写:
echo "$(date): <some messages>" >> /tmp/foo.log
执行过程与结果如下:

上面这样的方法记录日志虽然直接,但是如果要维护的不同的工具多了,每一个工具都各自独立这样记录日志,很难集中管理。所以,大家统一使用syslogd记录日志,就有了一个集中管理,集中配置的地方。
syslogd也是alpine linux默认安装的组件,并且alpine提供了文档:
我们可以先启动syslogd:
/ # syslogd
/ # ps -ef | grep syslogd
   48 root      0:00 syslogd
然后此时使用配套的logger命令来记录日志:
$ logger -t foo "hello, world"
syslogd的默认配置是把日志记录进/var/log/messages里面,所以我们可以查看一下这个文件里的日志:
$ cat /var/log/messages
日志内容如下:

可以看到我们通过logger命令记录的这条日志。此外,我们还在这个日志文件里看到了crond定期执行程序所输出的日志。
总结
可以看到syslog提供了一个统一的日志管理和配置的平台,大家统一把syslog使用起来,就可以集中管理日志了。此外,我们看到logrotate默认会去rotate这个syslog的/var/log/messages日志文件,而logrotate会由crond定期执行,这套工具就整合了起来,形成了一个完整的日志记录与管理的平台。
- 上一篇 tinkerpop的使用(下)
- 下一篇 docker挂装的文件分区权限