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

相关推荐
广东大榕树信息科技有限公司3 小时前
如何在国产化动环系统中实现智能调控与节能?
运维·网络·物联网·国产动环监控系统·动环监控系统
濊繵3 小时前
Linux网络--数据链路层
linux·运维·网络
oioihoii3 小时前
C++20协程如何撕开异步编程的牢笼
linux·服务器·c++20
叫致寒吧3 小时前
自动化运维工具 Ansible
运维·自动化·ansible
冉佳驹3 小时前
Linux ——— Git的核心操作流程、进程状态及环境变量相关知识
linux·git·进程·环境变量·进程状态·fork
黑不溜秋的3 小时前
Ubuntu 20.04 安装 搜狗输入法
linux·运维·服务器
norsd3 小时前
CentOS 设置 DNS
linux·运维·centos
XXYBMOOO3 小时前
使用 HTML5 Canvas 实现可交互的数据瀑布流(隐藏式运维模式)
运维·交互·html5
KaDa_Duck3 小时前
DASCTF 2025下半年赛 PWN-CV_Manager复盘笔记
linux·笔记·安全
Blossom.1183 小时前
Transformer时序预测实战:用PyTorch构建股价预测模型
运维·人工智能·pytorch·python·深度学习·自动化·transformer