目录
介绍
logrotate 是一个用于管理日志文件的工具,它主要用于日志的轮转(rotation)、压缩、删除和邮件通知等功能,广泛应用于 Linux 和类 Unix 系统中。
- 日志轮转:logrotate 可以定期将当前的日志文件重命名或移动,创建一个新的日志文件用于记录后续的日志信息。例如,将 access.log 重命名为 access.log.1,并创建新的 access.log。
- 日志压缩:轮转后的日志文件可以被压缩,节省磁盘空间。通常使用 gzip 或 bzip2 等工具进行压缩。
- 日志删除:可以根据配置规则删除过期的日志文件,避免日志文件占用过多磁盘空间。
- 邮件通知:当某些操作完成后,可以发送邮件通知管理员。
- 日志归档:可以将旧的日志文件归档到指定位置,便于后续的备份或分析。
使用
conf位置
一般在 /etc/logrotate.conf 处有个主conf
但是各个软件的conf都放在 /etc/logrotate.d 目录下
可以为每个进程单独在此处写入自己的conf,logrotate会在固定时间读取此处的conf,定期执行操作
conf结构解析
如下:
cat /etc/logrotate.d/dpkg
得到如下内容
/var/log/dpkg.log {
monthly
rotate 12
compress
delaycompress
missingok
notifempty
create 644 root root
}
- /var/log/dpkg.log:指定管理目标文件的路径
- monthly:每月一次,logrotate会在每个月的第一天检查这个日志,满足条件就执行轮转操作
- rotate 12:最多保留12个文件,发生第十三次的时候,最久的文件会被删除,其他依次向前移动一位
- compress:启动压缩功能
- delaycompress:当前文件不会被立即压缩,下次轮转的时候才会被压缩
- missingok:如果不存在,就不生成日志文件,并且不会报错
- notifempty:如果是空文件,就不会执行轮转操作,避免生成空文件
- create 644 root root:轮转后,logrotate 会创建一个新的空日志文件 dpkg.log,并设置其权限和所有者
此外还有一些其他的参数可以使用,按照类型进行分类:
- daily:每天轮转一次
- weekly:每周轮转一次
- size
:按照大小执行轮转, 可以是一个具体的数字(表示字节),或者是一个带有单位的数值(如 K、M、G 分别表示千字节、兆字节、吉字节)。 - copytruncate:先将当前的日志文件复制一份,然后清空原始日志文件的内容,而不是直接重命名或移动原始文件。避免影响原本文件描述符。但是可能会影响性能,在大量写入时造成少量日志丢失。
- dateext:文件添加日期拓展名
- dateformat -%Y-%m-%d:自定义日期格式
logratete conf文件示例
vim创建文件并编辑
vim /etc/logrotate.d/test
写入以下内容
/var/log/test.log {
daily
size 50M
rotate 4
compress
delaycompress
missingok
notifempty
copytruncate
dateext
dateformat -%Y-%m-%d
}
这个配置文件的作用是:
- 每天检查 /var/log/test.log 文件。
- 只有当文件大小达到或超过 50M 时,才会执行轮转操作。
- 轮转后的文件名会包含日期信息,格式为 test.log-YYYY-MM-DD。
- 保留最多 4 个旧的日志文件。
- 延迟压缩旧日志文件,直到下一次轮转时才压缩。
- 如果文件不存在或为空,不会报错或执行轮转操作。
- 使用 copytruncate 选项,清空原始日志文件的内容,但不改变文件的文件描述符(FD),以便应用程序可以继续写入日志。
CentOS和Ubuntu的区别
CentOS 系统中,logrotate 的执行通常由 cron 定时任务触发。
Ubuntu 从 22.04 开始,logrotate 的执行由 systemd-timer 管理。systemd-timer 是 systemd 的一部分,用于替代传统的 cron,提供更现代化、灵活且精细的定时任务管理。
CentOS查询logrotate调度时间间隔
检查调度文件,存在说明当前logrotate是通过cron定时任务出发,并且为每日任务
ls -l /etc/cron.daily/logrotate
可以通过以下命令检查每日cron的调度具体时间
crontab -l
也可以直接查看条目
cat /etc/crontab
可以看到类似于
0 4 * * * /usr/sbin/logrotate /etc/logrotate.conf
说明了logrotate在每天凌晨4点执行
Ubuntu查询logrotate调度时间间隔
在 Ubuntu 22.04 系统中,logrotate 的调度通常由 systemd-timer 管理。要查询 logrotate 的调度时间间隔,可以按照以下步骤:
直接使用sysctl查询
systemctl status logrotate.timer
得到以下结果:
● logrotate.timer - Daily rotation of log files
Loaded: loaded (/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Wed 2025-04-02 06:33:18 CST; 2 weeks 0 days ago
Trigger: Thu 2025-04-17 00:00:00 CST; 6h left
Triggers: ● logrotate.service
Docs: man:logrotate(8)
man:logrotate.conf(5)
Apr 02 06:33:18 ubuntu22 systemd[1]: Started Daily rotation of log files.