侧边栏壁纸
博主头像
LLJJJJ的博客

行动起来,活在当下

  • 累计撰写 15 篇文章
  • 累计创建 9 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Linux logrotate日志

Administrator
2026-08-10 / 0 评论 / 0 点赞 / 15 阅读 / 0 字

logrotate 是什么?

logrotate 是一个 Linux 系统自带的日志管理工具,用于自动切割、压缩、删除和归档日志文件。它由 cron 定时任务驱动(通常是每天执行一次),通过读取配置文件决定如何处理各个服务的日志。

核心价值:防止日志无限增长撑爆磁盘,同时让日志按时间/大小有序归档。


🗂️ 配置文件体系

logrotate 的配置分为两层:

层级

路径

作用

主配置文件

/etc/logrotate.conf

全局默认设置,所有日志都继承这里的配置

独立配置文件

/etc/logrotate.d/

每个服务一个文件(如 nginxmysqlsyslog),覆盖或补充全局配置

实际执行时,logrotate 会先读取主配置,然后按字母顺序遍历 /etc/logrotate.d/ 目录下的所有文件。


📝 配置语法详解

基本结构

bash

/路径/到/日志文件 {
    参数1
    参数2
    参数3
    # 可以嵌套脚本
    postrotate
        执行的命令
    endscript
}
  • 支持通配符:/var/log/nginx/*.log 匹配该目录下所有 .log 文件

  • 如果有多个路径,用空格分开:/var/log/nginx/access.log /var/log/nginx/error.log


🔧 核心参数详解

切割周期(选一个)

参数

含义

daily

每天切割(logrotate 默认每天执行一次,所以当天会切)

weekly

每周切割(具体哪天取决于 logrotate 的 cron 触发时间,通常是周一)

monthly

每月切割(每月1号)

yearly

每年切割(1月1号)

触发条件(可与周期并用)

参数

含义

size 100M

日志文件达到 100MB 就切割(优先级高于时间周期)

size 1G

单位支持 K/M/G

maxsize 100M

如果日志增长快,在达到该大小时切割(配合时间周期使用)

minsize 1M

只有文件大于该大小才切割(配合时间周期使用)

注意sizedaily/weekly/monthly 可以同时存在。logrotate 的规则是:哪个条件先满足就触发。比如配置了 dailysize 100M,如果一天内日志没到 100M,就等每天定时切割;如果半天就涨到 100M,会立即切割。

保留策略

参数

含义

rotate N

保留 N 个旧日志文件,超过则删除(默认不设则保留 0 个)

maxage N

删除超过 N 天的旧日志文件(配合 daily/weekly 等使用)

rotate 7 + daily

保留最近 7 天的日志,第 8 天自动删除

压缩

参数

含义

compress

用 gzip 压缩旧日志(生成 .gz 文件)

delaycompress

最近一次切割的日志不压缩(保留为 .1 文件),下次切割时再压缩

nocompress

不压缩(默认)

compresscmd / uncompresscmd

指定压缩/解压命令(默认 gzip)

delaycompress 的使用场景:方便你快速查看刚切割的日志(不用解压),因为昨天/今天可能还在排查问题,而更旧的日志可以直接压缩归档。

文件处理

参数

含义

create mode owner group

切割后创建新日志文件,指定权限、属主、属组(如 create 644 nginx nginx

nocreate

不创建新日志文件(依赖服务自己创建)

copytruncate

先复制原日志内容到新文件,然后清空原文件(而不是重命名+创建)

notifempty

如果日志文件为空,不进行切割

ifempty

即使空文件也切割(默认行为)

missingok

如果日志文件不存在,不报错继续执行

nomissingok

日志不存在时报错(默认)

权限与安全

参数

含义

su user group

以指定用户/组的身份执行 logrotate 操作(默认是 root)

sharedscripts

配置了 sharedscripts 时,postrotate 脚本在所有日志处理完后只执行一次

nosharedscripts

每个日志文件都分别执行 postrotate(默认)

其他

参数

含义

dateext

切割后的文件用日期命名(如 access.log-20260816),而不是数字编号(.1.2...)

dateformat -%Y%m%d

自定义日期格式(默认 -%Y%m%d

prerotate / endscript

切割前执行的脚本

postrotate / endscript

切割后执行的脚本

firstaction / endscript

第一次切割时执行(仅所有日志处理前执行一次)

lastaction / endscript

最后一次切割后执行(仅所有日志处理后执行一次)


🛠️ 常用命令

命令

作用

logrotate /etc/logrotate.conf

手动执行一次

logrotate -f /etc/logrotate.conf

强制执行(忽略上次执行时间)

logrotate -d /etc/logrotate.conf

调试模式(只显示会做什么,不实际执行)

logrotate -v /etc/logrotate.conf

详细模式(显示执行过程)

logrotate -f -v /etc/logrotate.d/nginx

强制且详细执行单个服务的配置

logrotate -m /usr/bin/mail

指定邮件发送命令(用于告警)

logrotate --version

查看版本

调试示例

bash

# 查看 nginx 的 logrotate 会怎么处理,但不真正执行
sudo logrotate -d /etc/logrotate.d/nginx

# 强制执行一次
sudo logrotate -f /etc/logrotate.d/nginx

📂 实际配置示例与解析

示例1:Nginx 标准配置

bash

/var/log/nginx/*.log {
        daily
        dateext 
        missingok
        rotate 14
        compress
        delaycompress
        notifempty
        create 0640 www-data adm
        sharedscripts
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                        run-parts /etc/logrotate.d/httpd-prerotate; \
                fi \
        endscript
        postrotate
                invoke-rc.d nginx rotate >/dev/null 2>&1
        endscript
}

可以看到切割后的日志文件

0

评论区