原来不知道有这样的东西,一直以为是Lighttpd、Nginx自带的切割。
项目上了docker之后发现Lighttpd和Nginx都不再切割了,但明明docker里的版本都比外面的新
今天重新google了一顿,发现原来是Centos自带的Logrotate在做这个操作,在docker里没了这玩意。同时也导致了硬盘空间占满的隐患。
中途遇到的2个问题:Crontab、以及服务端对文件的重新写入(logrotate改了文件名加上时间后缀后,不对服务端进行操作,Lighttpd Nginx都是继续往改了名之后的文件里输出log)
安装
我这里使用的alpine
apk add logrotate
配置Lighttpd
配置文件:/etc/logrotate.d/lighttpd
1 2 3 4 5 6 7 8 9 |
/var/log/lighttpd/*.log { missingok notifempty sharedscripts postrotate /usr/bin/killall -HUP lighttpd &>/dev/null || : endscript su lighttpd lighttpd } |
启动crond
crond指令即可启动。logrotate已经把自己的任务文件放在了/etc/periodic/daily/logrotate
只要crontab有运行,每天就会跑一次。
测试切割
注意,你手动logrotate /etc/logrotate.conf
,执行之后并不会就切割了log文件。
logrotate的工作原理大概是:每次切割操作、或首次切割,会记录所有log文件的时间点在 /var/lib/logrotate.status
。下一次执行的时候,如果判断时间减去记录的时间已经超过一定时长(默认7天weekly),那么就会执行切割。
所以如果你想马上切割,需要自己修改logrotate.status文件,把时间改为7天以前的,再执行,就会发现logrotate做了切割操作啦。
Lighttpd的postrotate
自动生成的,似乎在docker下并不能用,我在centos里找到了能用的
/usr/bin/killall -HUP lighttpd &>/dev/null || :
这个指令的作用,大致可以理解为重新创建log文件进行写入,这样logrotate之后,lighttpd才会写入的新的文件里。
这个是logrotate自带的lighttpd配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# $Header: /var/cvsroot/gentoo-x86/www-servers/lighttpd/files/lighttpd.logrotate,v 1.2 2006/05/30 19:49:29 bangert Exp $ # lighttpd logrotate script for Gentoo /var/log/lighttpd/*.log { daily missingok copytruncate rotate 7 compress notifempty sharedscripts postrotate /etc/init.d/lighttpd --quiet --ifstarted reload endscript su lighttpd lighttpd } |
附上一些配置说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
compress --> 压缩日志文件的所有非当前版本 daily,weekly,monthly --> 按指定计划轮换日志文件 delaycompress --> 压缩所有版本,除了当前和下一个最近的 endscript --> 标记 prerotate 或 postrotate 脚本的结束 errors "emailid" --> 给指定邮箱发送错误通知 missingok --> 如果日志文件丢失,不要显示错误 notifempty --> 如果日志文件为空,则不轮换日志文件 olddir "dir" --> 指定日志文件的旧版本放在 “dir” 中 postrotate --> 引入一个在日志被轮换后执行的脚本 prerotate --> 引入一个在日志被轮换前执行的脚本 rotate 'n' --> 保留 n 个历史日志文件 sharedscripts --> 对于整个日志组只运行一次脚本 size='logsize' --> 在日志大小大于 logsize(例如 100K,4M)时轮换 copytruncate --> 复制日志模式,如果实在不能重启、重新写入log文件,这个是个方法,原理是把日志复制,并把原来的文件清空。 |
crond如何自动运行
请看下一篇:Docker+Alpine下简单的运行多个进程。