学向勤中得,萤窗万卷书。这篇文章主要讲述#指尖人生#Linux系统服务---logrotate相关的知识,希望能为你提供帮助。
Linux 文件操作机制
介绍一下相关的 Linux 下的文件操作机制。
Linux 文件系统里文件和文件名的关系如下图。
目录也是文件,文件里存着文件名和对应的 inode 编号。通过这个 inode 编号可以查到文件的元数据和文件内容。文件的元数据有引用计数、操作权限、拥有者 ID、创建时间、最后修改时间等等。文件件名并不在元数据里而是在目录文件中。因此文件改名、移动,都不会修改文件,而是修改目录文件。
借《UNIX 环境高级编程》里的图说一下进程打开文件的机制。
进程每新打开一个文件,系统会分配一个新的文件描述符给这个文件。文件描述符对应着一个文件表。表里面存着文件的状态信息(??O_APPEND?
??/??O_CREAT?
??/??O_DIRECT?
?...)、当前文件位置和文件的 inode 信息。系统会为每个进程创建独立的文件描述符和文件表,不同进程是不会共用同一个文件表。正因为如此,不同进程可以同时用不同的状态操作同一个文件的不同位置。文件表中存的是 inode 信息而不是文件路径,所以文件路径发生改变不会影响文件操作。
logrotate原理logrotate 是怎么做到滚动日志时不影响程序正常的日志输出呢?logrotate 提供了两种解决方案。
1、create
这也就是默认的方案,可以通过 create 命令配置文件的权限和属组设置;这个方案的思路是重命名原日志文件,创建新的日志文件。详细步骤如下:
如上也就是 logrotate 的默认操作方式,也就是 mv+create 执行完之后,通知应用重新在新文件写入即可。mv+create 成本都比较低,几乎是原子操作,如果应用支持重新打开日志文件,如 syslog, nginx, mysql 等,那么这是最好的方式。
不过,有些程序并不支持这种方式,压根没有提供重新打开日志的接口;而如果重启应用程序,必然会降低可用性,为此引入了如下方式。
2、copytruncate
该方案是把正在输出的日志拷 (copy) 一份出来,再清空 (trucate) 原来的日志;详细步骤如下:
如上所述,对于 copytruncate 也就是先复制一份文件,然后清空原有文件。
【#指尖人生#Linux系统服务---logrotate】通常来说,清空操作比较快,但是如果日志文件太大,那么复制就会比较耗时,从而可能导致部分日志丢失。不过这种方式不需要应用程序的支持即可。
推荐阅读
- #yyds干货盘点# mybatis源码解读(executor包(懒加载功能))
- #yyds干货盘点#简单化MySQL优化小妙招
- oeasy教您玩转python - 008 - # ascii码表
- MySQL高级SQL语句(上)
- SQL编程题练习题(基础)#yyds干货盘点#
- 100 个 pandas 案例,强烈建议收藏!
- MySQL—— 数据库操作基础 和 常用语法(DDL,DML,DQL,DCL)
- 基于esbuild的universal bundler设计
- #yyds干货盘点#Prometheus 之告警的艺术