日志切割logrotate的介绍

  

1.日志切割的概念、必要性和基本思路

1.1 什么是日志切割

日志切割是指当应用或系统的日志文件达到设定的触发条件(如按照一定的时间周期:每天,按照大小:500MB),对其进行切割/分割处理,类似截断处理,把原本容量比较大的日志文件“劫走”转存为另外一个日志文件留存归档,这一刻之后产生的日志,继续输出到文件头被重置为0的日志文件中。

变化的部分:日志文件的容量(瘦身变小),日志文件的个数(多出一份被切割下的历史日志)

不变的部分:日志文件名不变

日志切割logrotate的介绍

此外,一段时间后,我们还需要删除时间久远的日志文件,整个过程也被俗称为日志滚动(log rotation)。

1.2 为什么要进行日志切割

在线应用(包括操作系统)在长期运行过程中,会产生很多过程日志记录,通常是应用程序记录的一些对系统管理员或者程序开发者有用的信息的文件,诸如正在执行什么、发生了什么错误等一系列信息。

随着日志记录的不断积累,日志文件越来越大,随着时间推移,会带来以下弊病:

  • 日志文件占用的硬盘空间越来越大
  • 日志文件太大,达到GB级别后查看内容太耗时,要追踪错误等非常不方便

一个栗子:

日志切割logrotate的介绍

1.3 日志切割的基本思路

日志切割的基本需求

  • 应用层面

    切割过程中不影响应用的正常运行(不能停用应用来分割日志)

  • 数据层面

    不丢失日志,或者在可接受的范围内丢失极少日志

    切割过程中不影响应用继续输出记录日志(日志文件名不变)

  • 日志容量层面

    切割后新的日志文件从空文件开始重新记录(容量和文件头被重置),便于后续查询使用

  • 日志归档层面

    切割后老旧日志方便归档压缩处理(文件名加上日期后缀等)

    分割后的老旧日志可按照保存周期轮询删除

  • 管理维护层面

    自动化周期性进行,周而复始

从以上需求出发,在满足不停用应用的首要前提下,可以设计出两种日志切割的基本思路

  • 思路1--重命名移走旧的日志文件,同时生成一个新的日志文件(文件名与切割之前保持一致)

    把现有日志mv成另外一个文件,同时自动生成一个同文件名(mv之前的日志文件名)的新日志文件

    日志的文件名不变但是需要确保应用可以指向新的文件句柄

    新的日志文件当然从0开始写,日志文件成功瘦身!

    日志切割logrotate的介绍

  • 思路2-拷贝并重命名一份现有日志文件,同时把现有容量大的日志文件内容清空

    把现有日志文件cp一份为另外的文件名,同时非常快速地把现有日志文件清空

    但不改变现有日志文件的文件句柄(在3.1.1章节会有更多详述)。

    这样日志文件的文件名和句柄都没有变化,只是内容已经被清空,也是从0开始继续写入,减肥成功!

    日志切割logrotate的介绍

    最后,需要结合定时任务,周期性定时执行日志切割任务,自动化处理

2. 常见的日志切割方案

2.1自定义脚本进行日志切割

自定义脚本切割日志,核心原理是mv已有的日志文件,然后生成一个新的日志文件,结合<代码> <代码>杀死usr1 PID来重载应用,以便应用获取新日志文件的文件句柄,日志即可输出到新的日志文件。

注意:

    <李>这里说的新日志文件的文件名没有变化,但本质上是一个全新的文件。 <李>杀死<代码> usr1 PID仅仅是重载应用配置,不会真正重启应用进程,因此不会引起应用停止运行

脚本切割nginx日志栗子:

 <代码类=" language-shell "> #/bin/bash
  bakpath=& # 39;/home/nginx/日志# 39;
  logpath=& # 39;/var/log/nginx/日志# 39;
  
  如果[!- d $ bakpath/(日期+ % Y)/美元(日期+ % m));
  ,mkdir - p $ bakpath/(日期+ % Y)/美元(日期+ % m)
  fi
  
  mv $ logpath/访问。日志bakpath美元/(日期+ % Y)/美元(日期+ % m)/访问- $ Y(日期+ % % m % d % H % m) . log
  
  #给nginx发送一个信号量,让nginx重载,重新生成新的日志文件
  杀死usr1“猫/usr/local/nginx/logs/nginx.pid”

日志切割logrotate的介绍