在docker的alpine环境下使用crond,logrotate,syslogd来管理日志

我们在架构时,会需要记录各种日志。Linux下面提供了crondlogrotatesyslogd这三个工具来完成这个任务,使用起来,比手写的解决方案要方便并且成熟得多。

其中:

因此上面三个工具整合起来就形成了一个完整的记录日志的方案:

本文通过使用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。可以看下配置文件的内容:

上面的配置文件里面定义了几样东西:

这样,当我们执行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已经定义了系统中的几个定时目录,分别对应hourlydailyweeklymonthly这样的频次。

此外,上面的配置当中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的使用

logrotatecrond的使用很直接,它会在daily目录里放一个logrotate脚本:

$ ls /etc/periodic/daily
logrotate

脚本内容如下:

因为上面这个脚本放在/etc/periodic/daily目录里,所以如果启动crond定时服务的话,上面的这个脚本就会每天执行一次。

从上面的脚本文件里可以看到,它的核心逻辑是这行:

$ /usr/sbin/logrotate /etc/logrotate.conf

所以crondlogrotate的默认整合方式就是:

在上面的分析当中,我们已经看过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定期执行,这套工具就整合了起来,形成了一个完整的日志记录与管理的平台。

My Github Page: https://github.com/liweinan

Powered by Jekyll and Theme by solid

If you have any question want to ask or find bugs regarding with my blog posts, please report it here:
https://github.com/liweinan/liweinan.github.io/issues