原来不知道有这样的东西,一直以为是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
/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配置文件
# $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
}
附上一些配置说明
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下简单的运行多个进程。