httpd日志和日志轮替工具(3)

可以在epel源中下载,或者从其github上安装:https://github.com/fordmason/cronolog

[root@xuexi ~]# cronolog -h usage: cronolog [OPTIONS] logfile-spec -H NAME, --hardlink=NAME maintain a hard link from NAME to current log -S NAME, --symlink=NAME maintain a symbolic link from NAME to current log -P NAME, --prev-symlink=NAME maintain a symbolic link from NAME to previous log -l NAME, --link=NAME same as -S/--symlink -h, --help print this help, then exit -p PERIOD, --period=PERIOD set the rotation period explicitly -d DELAY, --delay=DELAY set the rotation period delay -o, --once-only create single output log from template (not rotated) -x FILE, --debug=FILE write debug messages to FILE ( or to standard error if FILE is "-") -a, --american American date formats -e, --european European date formats (default) -s, --start-time=TIME starting time -z TZ, --time-zone=TZ use TZ for timezone -V, --version print version number, then exit

这个工具的使用非常简单,但必须得搞懂它的轮替原理。以下面设置为例:

CustomLog "|/usr/local/sbin/cronolog logs/%Y/%m/%d/access.log" combined

由于使用的是相对路径,所以它相对于ServerRoot。假设ServerRoot为/usr/local/apache,则这里的日志将创建在/usr/local/apache/logs/%Y/%m/%d/access.log,其中%Y、%m、%d分别表示的是年、月、日。这些修饰符组成的文件名或目录被称为模板。

cronolog的轮替原理是:根据当前日志文件模板的时间点,和当前时间进行比较,如果模板中的某个部分和当前时间点的不同,则需要进行轮替,轮替时会自动创建缺失的目录,并且计算下一次进行轮替的时间点。在轮替时,先关闭当前日志文件,再根据当前时间点创建新日志文件,并打开新日志文件。但注意,cronolog工具在创建或轮替时,如果没有请求到达,则不会立即创建日志文件,这和rotatelogs工具的默认情况是一样的。

看上去很简单,确实很简单,它只需要根据指定的时间修饰符和当前时间点进行比较就可以了。例如上面的配置,如果当前时间点为2017-10-01,则按照以下顺序进行创建,注意,只有在请求到达时才会创建,没有请求时是不会创建的。

Period 1:在第一个请求到达时创建

logs/2017目录是否存在,不存在则创建。

logs/2017/10目录是否存在,不存在则创建。

logs/2017/10/01目录是否存在,不存在则创建。

创建logs/2017/10/01/access.log文件,并写日志。

Period 2:在2017-10-02凌晨第一个请求到达时创建

logs/2017目录已存在,不创建。

logs/2017/10目录已存在,不创建。

logs/2017/10/02目录不存在,创建。

创建logs/2017/10/02/access.log文件,并写日志。

之后将继续按照此规则不断进行下去。

也就是说,cronolog默认将按照最小单位的时间修饰符为轮替时间间隔。例如,最小单位为%d时,将按照天轮替,最小单位为%W将按周轮替,最小单位为%S,将按秒轮替。但仍然需要说明的是,只有请求到达时,才会按照当前时间点创建新的日志文件。例如,如果按秒轮替,第10秒时创建了一个文件10.log,第11秒将关闭该日志文件,但是不会立即创建新日志文件,假设在第15秒时新的请求到达,则创建一个15.log,而不是11.log。

此外,cronolog可使用"-p N UNITs"选项显式指定轮替时间间隔,有效单位UNITs为:seconds,minutes,hours,days,weeks和months。例如"-p 5 minutes"表示每5分钟轮替一次。但需要注意,N的值必须为更高一级UNITs的公因数(不包括最大公因数),例如小时的长度为60分钟,在指定minutes单位时,可以指定"1,2,3,4,5,6,10,15,20,30 minutes",但不能指定为"7,9,11,12,13,14"等minutes。

如果不想轮替,有两种方法:不要使用时间类的修饰符;使用"-o"选项。这时候会一直写同一个文件。

cronolog还支持动态符号链接功能,例如下面的配置,这样就使得每次访问/usr/local/apache/logs/access_log都能访问到最新的日志文件。

CustomLog "|/path/to/cronolog --symlink=/usr/local/apache/logs/access_log /usr/local/apache/logs/%Y/%m/access_log" combined

最后,cronolog不支持日志截断。

1.5 rotatelogs和cronolog的比较

这两个工具各有优缺点。

在日志文件路径上:rotatelogs无法将时间类修饰符作为目录,只能使用在日志文件名上。而cronolog可以。例如logs/%Y%m/%d/access.log。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/359ce9944ba8036035d2cb968ad401d5.html