需求

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

  1. 按日期自动切割日志,最小单位是天。
  2. 当日志总量超过一定量时,自动直接清理日志,限定总量不能超过1000MB。
  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=/path/to/nginx/
pid_path=/path/to/nginx.pid #清理掉指定日期前的日志
DAYS= #生成昨天的日志文件
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 /path/to/nginx/ | awk '{print int($1/1024/1024)}'` if [size -gt ];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 * * * /path/to/script

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

linux服务器自动切割日志的更多相关文章

  1. linux系统日志自动切割工具----logrotate

    参考资料 :https://www.cnblogs.com/kevingrace/p/6307298.html 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务 ...

  2. linux服务器上nginx日志访问量统计命令

    linux服务器上nginx日志访问量统计命令 日志文件所在地方:/var/log/nginx/access_iqueendress.com.log/var/log/nginx/access_m.iq ...

  3. 【shell脚本】nginx每天自动切割日志脚本

    nginx每天日志量比较大的时候,最好每天自动切割,存储,这样可以方面以后的查询和分析 #!/bin/sh ################### #filename: nginx_log_rotat ...

  4. Linux服务器上创建日志服务器和FTP服务器

    参考地址: http://www.111cn.net/sys/CentOS/81133.htm https://www.cnblogs.com/laoxiajiadeyun/p/9943742.htm ...

  5. linux服务器上tomcat日志中的中文乱码

    转: 修改tomcat应用日志默认编码格式 前言 今天开发跟我说tomcat日志中的中文不能正常显示,根据以往的经验,我觉得可能跟服务器的编码有关,于是尝试各种方法,但还是没能解决问题. 后来我突然想 ...

  6. MobaXterm实时查看Linux服务器上的日志

    一.工具 MobaXterm介绍  https://blog.csdn.net/juyin2015/article/details/79056687/ 1.,点击Session 输入服务器IP.用户名 ...

  7. linux服务器自动备份与删除postgres数据库数据

    1.先创一个back.sh 文件,授权,然后在下面这个文件添加脚本 export PGPASSWORD='123456'        #这是登录服务器密码cur_time=`date +%Y%m%d ...

  8. Linux服务器自动备份压缩MySQL数据库的实用方法

    <?php$server = 'localhost'; $link = mysql_connect($server, 'root', 'haven'); $result = mysql_quer ...

  9. linux服务器查看项目日志命令

    1.tailf mywork.log | grep --line-buffered findUserList      实时跟踪日志,这里是只要findUserList 这个方法被运行,就会将它的日志 ...

随机推荐

  1. 基于HTML5坦克大战游戏简化版

    之前我们有分享过不少经典的HTML5游戏,有些还是很有意思的,比如HTML5版切水果游戏和HTML5中国象棋游戏.今天要分享的是一款简化版的HTML5坦克大战游戏,方向键控制坦克的行进方向,空格键发射 ...

  2. lua工具库penlight--08额外的库(一)

    额外的库 在这一节中的库不再被认为是Penlight的核心部分,但在需要时,仍提供专门的功能. 简单的输入的模式 Lua 的字符串模式匹配是非常强大,通常您将不需要传统的正则表达式库.即便如此,有时  ...

  3. [转]Vim插件管理工具Vundle

    原文:http://www.linuxzen.com/vimpei-zhi-xi-lie-cha-jian-guan-li.html 当转载成为一种习惯.. 最近对Vim进行了一番较大的配置变动,所以 ...

  4. Linux下清空缓冲区的方法

    Linux下清空缓冲区的方法 C标准规定fflush()函数是用来刷新输出(stdout)缓存的.对于输入(stdin),它是没有定义的.但是有些编译器也定义了fflush( stdin )的实现,比 ...

  5. Keil的使用方法(汇总)

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang 软件的开发 ...

  6. 使用jQuery模拟Google的自动提示效果

    注意: 1.本功能使用SqlServler2000中的示例数据库Northwind,请打SP3或SP4补丁:2.请下载jQuery组件,河西FTP中有下载:3.本功能实现类似Google自动提示的效果 ...

  7. [Java] 高效快速导入EXCEL数据

    需求1.高效率的以excel表格的方式导入多条数据.2.以身份证号为唯一标识,如果身份证号已存在,则该条数据不导入. 分析刚开始的时候是传统的做法,解析excel数据,获取单个对象,判断身份证是否已存 ...

  8. 在函数体的“出口处”,对 return 语句的正确性和效率进行检查

    在函数体的“出口处”,对 return 语句的正确性和效率进行检查. 如果函数有返回值,那么函数的“出口处”是 return 语句. 我们不要轻视 return 语 句.如果 return 语句写得不 ...

  9. SQL还可以这么玩儿

    对于数据库的增删改查,我们都再熟悉不过了,今天,将和您一起探讨几种不一样的SQL用法,原来,SQL还可以这么玩儿. 以下是数据库的原表,如图-1. 1.快速复制表结构 这时,如果我们需要复制一份一模一 ...

  10. php 文件下载代码

    1.对于一般 $file = "/tmp/dummy.tar.gz"; header("Content-type: application/octet-stream&qu ...