温馨提示×

linux日志切割如何配置

小樊
40
2026-09-23 18:25:01
栏目: 智能运维

在 Linux 下,**日志切割(Log Rotation)**最常见的做法是使用系统自带的 logrotate 工具。下面从「原理 → 配置方式 → 示例 → 常用参数 → 验证」一步步说明。


一、logrotate 是什么

  • logrotate 是 Linux 自带日志管理工具
  • 默认每天由 cron 或 systemd timer 执行
  • 支持:
    • 按大小 / 时间切割
    • 压缩
    • 保留份数
    • 切割后执行脚本(如重启服务)

配置文件位置:

/etc/logrotate.conf          # 主配置
/etc/logrotate.d/           # 各服务配置目录

二、最简单的配置示例

1️⃣ 自定义日志切割配置

例如你的日志在:

/var/log/myapp/app.log

新建配置文件:

vim /etc/logrotate.d/myapp

内容示例:

/var/log/myapp/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

2️⃣ 参数说明

参数 作用
daily 每天切割
weekly 每周
monthly 每月
rotate 7 保留 7 份
compress 压缩旧日志
missingok 日志不存在不报错
notifempty 空日志不切割
copytruncate 复制后清空原文件(不重启服务)

三、常见场景配置

✅ 场景 1:Nginx 日志

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx nginx
    sharedscripts
    postrotate
        systemctl reload nginx > /dev/null 2>&1
    endscript
}

✅ 场景 2:Java 应用(不能重启)

/opt/app/logs/*.log {
    size 100M
    rotate 5
    compress
    copytruncate
    missingok
    notifempty
}

copytruncate 适合不支持信号重开的程序


四、手动测试 logrotate

检查配置文件语法

logrotate -d /etc/logrotate.d/myapp

强制执行一次

logrotate -f /etc/logrotate.d/myapp

五、logrotate 执行时间

  • CentOS / RHEL:
/etc/cron.daily/logrotate
  • Ubuntu(systemd):
systemctl status logrotate.timer

六、不依赖 logrotate 的方案(补充)

如果你是:

  • Docker 容器
  • 自写程序

可以用:

  • logrotate + copytruncate
  • 应用内日志库(log4j / logback / zap)
  • 容器 logging driver

七、常见问题

❓ 日志没切割?

  • 是否空日志(notifempty)
  • 是否权限不足
  • 是否 cron 没运行

❓ 切割后服务写不进日志?

  • 用 copytruncate 或 postrotate reload

如果你愿意,可以告诉我:

  • 你用的 系统(CentOS / Ubuntu)
  • 日志路径 & 服务类型(Nginx / Java / 自研)

我可以给你一份 可直接用的配置。

0 踩