logrotate实际运行机制及Apache httpd日志轮转配置相关疑问
首先先纠正你现有配置理解的偏差:
compress:默认使用gzip压缩轮转后的日志,生成.gz后缀的文件,不是zip压缩delaycompress:作用是推迟一次压缩操作,第一次轮转生成的后缀为.1的日志不会被压缩,等到下一次轮转时,才会将这份.1的日志压缩为.2.gz。该配置通常用于避免还在写入日志的进程无法操作压缩文件的问题。
以下是你三个问题的解答:
1. 轮转后的日志存储位置
默认和原日志文件存放在同目录,也就是/var/log/httpd/路径下。以Apache默认的访问日志access_log为例,你的配置下轮转后的命名规则如下:
- 第一次轮转生成未压缩的
access_log.1(受delaycompress配置影响) - 第二次轮转时,原有
access_log.1会被压缩为access_log.2.gz,新生成的轮转文件为access_log.1 - 最多保留3份历史日志,第4次轮转时最早的
access_log.3.gz会被自动删除。
2. logrotate是否仅在size条件满足时才运行
不是。你的配置中同时设置了daily和size 20K,两个条件是或的关系,满足任意一个就会触发轮转:
- 距离上次轮转时间满1天,不管日志大小是否达到20K,都会执行轮转
- 距离上次轮转不足1天,但日志大小已经达到20K,也会触发轮转
注意:以上触发的前提是logrotate命令本身被执行,如果logrotate没有被调用,哪怕两个条件都满足也不会自动执行轮转操作。
3. logrotate的触发时机、运行逻辑及搭配cron的原因
运行逻辑
logrotate是单次执行的命令行工具,没有后台常驻的守护进程。每次运行时会读取指定的配置文件,逐一检查所有配置的日志是否满足轮转条件,满足条件就执行轮转、压缩、删除过期日志等操作,执行完成后进程直接退出。
触发时机
多数Linux发行版默认会自带系统级的logrotate cron任务,一般位于/etc/cron.daily/logrotate,每天执行一次,用来处理系统默认的日志轮转需求。
搭配自定义cron的原因
默认的每日执行频率很低,如果你的size阈值设置较小(比如你配置的20K),日志可能在几小时甚至几分钟内就达到阈值,但默认cron每天才运行一次,会导致日志超阈值很久都无法轮转,严重时会占满磁盘空间。所以需要自定义更频繁的cron任务(比如每10分钟、每小时执行一次logrotate),才能及时检测到size阈值满足的情况,触发轮转操作。
内容的提问来源于stack exchange,提问作者user15224751
相关产品推荐
相关产品推荐

