原来不知道有这样的东西,一直以为是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下简单的运行多个进程。