在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挂装的文件分区权限