linux服务器自动切割并清理日志

由于nginx的日志会不停地增大,所以需要我们自己去切割日志,方便管理,需要达到以下的效果:

1.按日期自动切割日志,最小单位是天。
2.当日志总量超过一定量时,自动直接清理日志,限定总量不能超过1GB。
3.写入crontab定时任务里。

分析

1.nginx日志目录下分别有access.log和error.log,按照日期自动切割日志则需要将每天的日志以”yyyymmdd_access/error.log”的格式保存下来,用mv重命名每一天的日志文件即可。
 2. 清理日志就简单了,只需要判断这个文件夹下的大小,然后将一定日期之前的日志文件清理掉就ok了。
 3. crontab任务也比较简单,详情可以看这里。
 4. 问题的关键在于,用mv重命名完昨天的日志文件后,nginx还是会向这个重命名后的文件(如access_20160409.log)写入日志,我们的目的是需要使nginx重新生成一个新的日志文件(access.log)并写入。
 5. As we all know,Linux系统下一切都是文件,所以每一个进程都有其文件描述符,而nginx进程将其自己的文件描述符写入了nginx.pid中,我们需要告诉nginx,让其重新打开一个新的日志文件(日志文件的配置详情可看这里,简单说就是让日志记录什么内容。)于是我们需要这条指令:
 kill -USR1 `cat ${pid_path}`
 这条指令的意思是:首先cat到nginx的pid,是一个整数,然后将信号USR1发送给这个进程,nginx进程收到这个信号后,会根据配置重新打开一个新的日志文件,并将日志写入。

实现

脚本cut_nginx_log.sh:

#!/bin/bash
log_path=/var/log/nginx/  
pid_path=/run/nginx.pid

#清理掉指定日期前的日志
DAYS=30

#生成昨天的日志文件
mv ${log_path}access.log ${log_path}access_$(date -d "yesterday" +"%Y%m%d").log
mv ${log_path}error.log ${log_path}error_$(date -d "yesterday" +"%Y%m%d").log


#重新打开一个新的日志文件(检测是否拥有权限)
kill -USR1 `cat ${pid_path}`

#文件夹大小
size=`du -b /var/log/nginx/ | awk '{print int($1/1024/1024)}'`

if [$size -gt 1000];then
    find ${logs_path} -name "access_*" -type f -mtime +$DAYS -exec rm {} \;
    find ${logs_path} -name "error_*" -type f -mtime +$DAYS -exec rm {} \;
fi

添加至crontab:
(每天零点自动执行)
crontab -e
0 0 * * * /var/spool/cron/crontab/test

至此就解决了自动切割并清理日志的功能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值