CentOS 7 日志切割实战:Logrotate 详解与配置指南

文章目录


CentOS 7 日志切割实战:Logrotate 详解与配置指南

日志管理是服务器运维中不可或缺的一环,而 Logrotate 作为 Linux 系统自带的日志轮换工具,能够高效自动化地处理日志文件的切割、压缩、删除等操作。本文将深入解析 CentOS 7 中 Logrotate 的配置技巧与实战应用。


Logrotate 简介

Logrotate 通过预设规则自动对日志文件进行轮换(Rotate),避免单个日志文件过大导致磁盘空间不足或影响读写性能。其核心功能包括:

  • 切割日志:按时间或大小拆分日志文件。
  • 压缩存储:减少历史日志的磁盘占用。
  • 自动清理:保留指定数量的旧日志,防止堆积。

安装与配置文件

确认安装

CentOS 7 默认已集成 Logrotate,可通过以下命令验证:

bash 复制代码
rpm -qa | grep logrotate
# 若未安装,执行:yum install logrotate -y

配置文件结构

  • 主配置文件/etc/logrotate.conf
    定义全局配置(如压缩格式、轮换周期等)。
  • 自定义配置目录/etc/logrotate.d/
    存放各服务的独立配置文件(如 Nginx、Apache 等)。

核心配置参数详解

以下为常用配置选项(以 /etc/logrotate.d/nginx 为例):

bash 复制代码
/var/log/nginx/*.log {
    daily               # 按天切割
    missingok           # 日志不存在时不报错
    rotate 30           # 保留30份旧日志
    compress            # 启用压缩(默认gzip)
    delaycompress       # 延迟压缩最新一份日志
    notifempty          # 空日志不轮换
    sharedscripts       # 所有日志处理完再执行脚本
    postrotate          # 切割后执行的命令
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
    dateext             # 使用日期作为后缀格式
    dateformat -%Y%m%d  # 自定义日期格式(示例:.log-20231001)
}

关键参数说明:

  • 切割周期dailyweeklymonthlysize(如 size 100M
  • 保留数量rotate X 指定保留旧日志的数量。
  • 压缩控制
    compress 立即压缩;delaycompress 延迟压缩上一个轮换文件。
  • 脚本钩子
    prerotate/postrotate 在切割前后执行命令(如重启服务)。

实战配置案例

案例1:Nginx 日志切割

bash 复制代码
# /etc/logrotate.d/nginx
/var/log/nginx/access.log
/var/log/nginx/error.log {
    daily
    rotate 7
    missingok
    compress
    delaycompress
    notifempty
    dateext
    sharedscripts
    postrotate
        # 向Nginx主进程发送USR1信号重新打开日志文件
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

案例2:按大小切割应用日志

bash 复制代码
# /etc/logrotate.d/myapp
/opt/myapp/logs/*.log {
    size 200M          # 超过200MB时触发切割
    rotate 5           # 保留5个归档
    compress
    notifempty
    copytruncate       # 复制原日志后截断,避免重启服务
}

案例3:Java 程序日志 test.log 切割配置

假设你的 Java 程序生成的日志文件路径为 /opt/myapp/logs/test.log,我们希望每天切割一次日志,保留最近 7 天的日志,并对旧日志进行压缩。

创建 Logrotate 配置文件

/etc/logrotate.d/ 目录下创建一个新的配置文件,例如 myapp

bash 复制代码
sudo vi /etc/logrotate.d/myapp

添加配置内容

将以下内容添加到配置文件中:

bash 复制代码
/opt/myapp/logs/test.log {
    daily               # 每天切割一次
    missingok           # 如果日志文件不存在,不报错
    rotate 7            # 保留7份旧日志
    compress            # 压缩旧日志
    delaycompress       # 延迟压缩最新一份日志
    notifempty          # 如果日志为空,不进行切割
    copytruncate        # 复制日志后截断原文件,避免重启Java程序
    dateext             # 使用日期作为日志文件后缀
    dateformat -%Y%m%d  # 自定义日期格式(示例:test.log-20231001)
}

配置说明

  • daily:每天切割一次日志。
  • missingok:如果日志文件不存在,Logrotate 不会报错。
  • rotate 7:保留最近 7 天的日志文件,超过的会被删除。
  • compress:使用 gzip 压缩旧日志文件。
  • delaycompress:延迟压缩最新一份日志文件,方便查看。
  • notifempty:如果日志文件为空,则不进行切割。
  • copytruncate:复制日志文件后截断原文件,适用于不支持重启的 Java 程序。
  • dateext:在日志文件名后添加日期后缀。
  • dateformat :自定义日期格式(例如 test.log-20231001)。

手动测试配置

在正式使用前,可以通过以下命令手动测试配置是否正确:

bash 复制代码
sudo logrotate -vf /etc/logrotate.d/myapp
  • -v:显示详细信息。
  • -f:强制立即执行切割。

如果配置正确,你会看到类似以下的输出:

复制代码
reading config file /etc/logrotate.d/myapp
Handling 1 logs

rotating pattern: /opt/myapp/logs/test.log  after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
considering log /opt/myapp/logs/test.log
  log needs rotating
rotating log /opt/myapp/logs/test.log, log->rotateCount is 7
dateext suffix '-20231001'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
copying /opt/myapp/logs/test.log to /opt/myapp/logs/test.log-20231001
truncating /opt/myapp/logs/test.log
compressing log with: /bin/gzip

验证日志切割结果

执行完 Logrotate 后,检查日志目录 /opt/myapp/logs/,应该会看到类似以下文件:

  • test.log:当前日志文件(已被截断)。
  • test.log-20231001.gz:切割并压缩的旧日志文件。

定时任务

Logrotate 默认通过 cron 每天执行一次。你可以查看 /etc/cron.daily/logrotate 文件确认:

bash 复制代码
cat /etc/cron.daily/logrotate

如果需要调整执行频率,可以修改 /etc/cron.daily/logrotate 或创建自定义 cron 任务。


手动测试与调试

手动执行轮换

bash 复制代码
# -v 显示详细信息,-f 强制立即执行
logrotate -vf /etc/logrotate.d/nginx

调试配置问题

  • 查看执行记录

    bash 复制代码
    grep logrotate /var/lib/logrotate/logrotate.status
  • 模拟运行(Dry Run)

    bash 复制代码
    logrotate -d /etc/logrotate.d/nginx

常见问题排查

日志未按预期切割

  • 检查 cron 任务 :Logrotate 由 /etc/cron.daily/logrotate 定时调用,确认 cron 服务运行正常。
  • 验证配置文件语法:确保无语法错误,路径正确。
  • 文件权限问题:确保日志目录对 Logrotate 进程可写。

切割后服务日志不更新

  • 使用 copytruncate 替代 postrotate:某些应用需复制后截断原文件,避免依赖信号重启。
  • 确认 postrotate 脚本正确性 :如 Nginx 需发送 USR1 信号而非重启。

总结

Logrotate 通过灵活的配置策略,极大地简化了日志管理的工作量。合理设置切割规则、压缩策略和钩子脚本,既能保障日志可追溯性,又能有效节省磁盘空间。建议结合业务需求定期审查日志配置,确保其高效稳定运行。

相关推荐
用户9718356334661 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 小时前
linux 拷贝文件或目录到指定的位置
linux
大树8818 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠18 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质19 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush419 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52019 小时前
Linux 11 动态监控指令top
linux
Inhand陈工20 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智20 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩20 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言