linux系统日志管理工具–logrotate

logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件,logrotate的运作完全自动化,不必进行任何进一步的人为干预。

之前有写过一篇 nginx日志切割及7天前的历史日志删除的脚本 ,也可以用logrotate来实现

0x01 配置文件

主流Linux发行版上都默认安装有logrotate包。

默认的配置文件路径:

/etc/logrotate.d:不同的程序日志可以单独写个配置文件放着这里面,没有设定的细节自动以conf中设定的来作默认值;

/etc/logrotate.conf:主配置文件。

运行命令:

logrotate [-vf] /etc/logrotate.conf

-v:启动显示模式,会显示 logrotate 执行的过程

-f:不论是否符合配置文件地规则,强制每个日志都进行 rotate 的动作

0x02 配置说明

# vim /etc/logrotate.conf

weekly #一周执行一次,其它可用值为'daily','monthly'或'yearly'

rotate 4  #保留多少个日志文件

create  #创建新的日志文件

dateext  #文件后缀是日期格式,如:secure-20161030,如果注释掉则格式为:secure-1

#compress  #是否压缩日志

include /etc/logrotate.d  #加载logrotate.d目录中的所有文件

/var/log/wtmp {   #针对/var/log/wtmp所设定的参数

monthly    #每月执行一次

create 0664 root utmp  #指定新建日志文件的权限和所属用户、组

minsize 1M  #文件大小超过1M才会切割

rotate 1  #只保留一个日志

}

/var/log/btmp {  #针对/var/log/btmp所设定的参数

missingok  #如果指定的目录不存在,logrotate会报错,此项用来关闭报错

monthly  #每月执行一次

create 0600 root utmp  #指定新建日志文件的权限和所属用户、组

rotate 1  #只保留一个日志

}

PS:wtmp可记录用户登录系统和重启的时间;另外因为有minsize的参数,所以不一定是每月执行一次,得先满足minsize设置的大小。

0x03  实例

1、切割syslog服务日志

# vim /etc/logrotate.d/syslog

/var/log/cron

/var/log/maillog

/var/log/messages

/var/log/secure

/var/log/spooler  #上面几个为被处理的日志绝对路径,每行一个或者用空格分隔

{

sharedscripts  # 表示postrotate脚本在压缩了日志之后只执行一次

postrotate  #在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务

/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true  #相当于reload

endscript

}

执行脚本:

可调用外部指令来进行额外的命令,这个设定需与 sharedscripts .... endscript 设定合用才行。

prerotate:在启动 logrotate 之前进行的指令,例如修改文件的属性等动作;

postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务。

可以看出syslog配置文件没有写执行周期,日志后缀这些,就会自动使用logrotate.conf配置参数。

 

假设messages日志文件有增加chattr +a属性时,根据上面配置messages会被更改成messages-20161030。但由于我们加上了+a参数,更名是失败的。这时就可以用下面的配置来操作

# vim /etc/logrotate.d/syslog

/var/log/cron

/var/log/maillog

/var/log/messages

/var/log/secure

/var/log/spooler

{

sharedscripts

prerotate

/usr/bin/chattr -a /var/log/messages   #先把+a属性移除

endscript

sharedscripts

postrotate

/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true

/usr/bin/chattr +a /var/log/messages   #更名之后再加上+a属性

endscript

}

2、切割Nginx

在/etc/logrotate.d下新建nginx文件;

编辑nginx文件,添加下面配置文件

/usr/local/nginx/logs/*.log {

daily

rotate 30

sharedscripts

postrotate

if [ -f /usr/local/nginx/logs/nginx.pid ]; then

kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

fi

endscript

}

按天切割nginx日志文件,保留30个日志文件,最后重启nginx。

weinxin
聂扬帆博客
一个分享IT运维相关工作经验和实战技巧的个人博客

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: