logrotate 原理

logrotate 是怎么做到滚动日志时不影响程序正常的日志输出呢?logrotate 提供了两种解决方案。

  1. create
  2. copytruncate

Linux 文件操作机制

介绍一下相关的 Linux 下的文件操作机制。

Linux 文件系统里文件和文件名的关系如下图。

目录也是文件,文件里存着文件名和对应的 inode 编号。通过这个 inode 编号可以查到文件的元数据和文件内容。文件的元数据有引用计数、操作权限、拥有者 ID、创建时间、最后修改时间等等。文件件名并不在元数据里而是在目录文件中。因此文件改名、移动,都不会修改文件,而是修改目录文件。

借《UNIX 环境高级编程》里的图说一下进程打开文件的机制。

进程每新打开一个文件,系统会分配一个新的文件描述符给这个文件。文件描述符对应着一个文件表。表里面存着文件的状态信息(O_APPEND/O_CREAT/O_DIRECT…)、当前文件位置和文件的 inode 信息。系统会为每个进程创建独立的文件描述符和文件表,不同进程是不会共用同一个文件表。正因为如此,不同进程可以同时用不同的状态操作同一个文件的不同位置。文件表中存的是 inode 信息而不是文件路径,所以文件路径发生改变不会影响文件操作。

create

这也就是默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是重命名原日志文件,创建新的日志文件。详细步骤如下:

  1. 重命名正在输出日志文件,因为重命名只修改目录以及文件的名称,而进程操作文件使用的是 inode,所以并不影响原程序继续输出日志。
  2. 创建新的日志文件,文件名和原日志文件一样,注意,此时只是文件名称一样,而 inode 编号不同,原程序输出的日志还是往原日志文件输出。
  3. 最后通过某些方式通知程序,重新打开日志文件;由于重新打开日志文件会用到文件路径而非 inode 编号,所以打开的是新的日志文件。

如上也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。

不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了如下方式。

copytruncate

该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志;详细步骤如下:

  1. 将当前正在输出的日志文件复制为目标文件,此时程序仍然将日志输出到原来文件中,此时,原文件名也没有变。
  2. 清空日志文件,原程序仍然还是输出到预案日志文件中,因为清空文件只把文件的内容删除了,而 inode 并没改变,后续日志的输出仍然写入该文件中。

如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。

通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。

logrotate 日志切割 原理相关推荐

  1. Logrotate日志切割

    Logrotate日志切割 1. 配置文件 1.1 配置放在那里 1.2 配置文件参数含义 2. 范例 3. 手动触发测试 在Linux下,日志会不停的增长,为了防止日志文件过大,导致我们无法在日志中 ...

  2. Linux Logrotate日志切割管理

    Logrotate 是 linux 系统用来分割日志的系统工具.Logrotate 可以设置为每天.每周.每月或当日志文件达到一定的大小时处理日志文件,提供自动压缩.删除.分割日志文件的功能.一般 C ...

  3. Linux logrotate日志切割详解

    1,对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己 ...

  4. Syslog-ng+Rsyslog收集日志:logrotate日志切割、轮询(七)

    很多软件都自带切割日志,比如tomcat可以按时间来命名.rsyslog可按日期生成文件,但是并不支持用"%$year%-%$month%-%$day%"这些变量来读取文件(目前版 ...

  5. Linux日志切割工具logrotate原理和配置详解

     前言: 对于Linux系统安全来说,日志文件是及其重要的工具 一.logrotate概念 1.1 概念 logrotate 程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的 ...

  6. Linux日志切割神器Logrotate的原理和配置详解,建议收藏!!!

    对于 Linux 系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分 Nginx日志之类的 CRON脚本,大家似乎遗忘了 Logrotate,争相发 ...

  7. Linux 日志切割神器 Logrotate 原理和配置详解(附多生产实例)

    点击上方"民工哥技术之路",选择"设为星标" 回复"1024"获取独家整理的学习资料! 对于 Linux 系统安全来说,日志文件是极其重要的 ...

  8. Linux 日志切割神器 Logrotate 原理和配置详解

    对于 Linux 系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分 Nginx日志之类的 CRON 脚本,大家似乎遗忘了 Logrotate,争相 ...

  9. Linux使用logrotate来切割日志文件

    程序在运行的时候为了了解运行状态,会输出日志文件,时间久了日志文件会变得非常大,甚至达到GB级别.我在golang应用里使用logrus包来打日志,配置和使用都很方便,就是没有日志分割的功能,应用在线 ...

最新文章

  1. java加密 des
  2. jmeter根据循环获取参数_jmeter forEach循环获取response参数值进行接口请求
  3. editplus 快捷键
  4. 双非同学,自学编程,毕业一年逆袭百度!
  5. 在JavaScript中定义枚举的首选语法是什么? [关闭]
  6. 450B Jzzhu and Sequences 我考研之后做的第一道题
  7. java实现爬虫_手把手教你从零开始用Java写爬虫
  8. im即时通讯源码带教程/uniapp即时通讯源码,附安装教程
  9. 数据链路层之以太网、MAC、MTU详解
  10. 【PyCharm 使用指南】之 error running
  11. 【android】Android Studio创建模拟手机虚拟机
  12. 如何提高学生对计算机英语的兴趣论文,如何培养小学生英语学习的兴趣_英语论文.doc...
  13. win10隐藏输入法指示器的设置方法
  14. 极智AI | 目标检测实现分享二:听说克莱今天复出了?详解 YOLOv2 算法与克莱检测
  15. Java 8 新特性|Collectors.joining()
  16. Homepod评测:一款音质超棒但低智商的音箱
  17. 【年入百万】我用真人真事谈谈用脑子赚钱
  18. Sentinel Dashboard轻松流控
  19. 随机数生成器(结绳中文app编程)
  20. 如何启用GPO回送处理

热门文章

  1. cisco交换机故障Flash空间不足
  2. TimesTen 数据库复制学习:4. 定义Active Standby Pair复制策略
  3. php获取路由器ip地址吗,路由器如何查看IP地址? TP-Link路由器查看IP地址的详细图解...
  4. 英特尔cpu支持Linux,英特尔公布对Icelake CPU的Linux Perf支持
  5. 直播app开发所需的三方
  6. 【项目相关技术】:父工程的创建、gitee和IDEA使用、面向接口编程、swagger2测试、自定义异常处理、日志、VO/PO、XXMapping、TODO
  7. 职教云python题和答案_智慧职教云课堂Python程序设计基础题库及答案
  8. 机器学习篇——对数线性模型
  9. ifeq makefile 或语句_makefile ifeq 语句
  10. ifeq makefile 或语句_Makefile ifeq、ifneq、ifdef和ifndef(条件判断)