Linux日志轮转管理:logrotate 完全指南

一、引言:为什么需要日志轮转

在Linux服务器运维中,日志文件是排查问题、审计安全、分析性能的核心依据。然而,日志文件具有无限增长的特性------如果不加管理,单个日志文件可能在数月内膨胀至数十GB,最终导致:

  • 磁盘空间耗尽:服务器因磁盘满而拒绝服务(No space left on device)
  • 日志分析困难:超大文件导致文本编辑器崩溃,检索效率极低
  • 性能下降:持续写入单个大文件增加I/O压力
  • 合规风险:未定期归档的日志可能违反数据留存政策

logrotate 是Linux系统自带的日志管理工具,通过cron定时任务执行,支持日志的定期切割、压缩、删除与归档后动作。本文将从原理、配置、实战到最佳实践,全面解析logrotate的运作机制。


二、logrotate 核心架构与工作原理

2.1 Linux日志管理双层架构

在现代Linux系统中(尤其是使用Systemd的发行版),日志管理呈现双层架构
#mermaid-svg-cEuqUZ3CXvoLedCL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cEuqUZ3CXvoLedCL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cEuqUZ3CXvoLedCL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cEuqUZ3CXvoLedCL .error-icon{fill:#552222;}#mermaid-svg-cEuqUZ3CXvoLedCL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cEuqUZ3CXvoLedCL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cEuqUZ3CXvoLedCL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cEuqUZ3CXvoLedCL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cEuqUZ3CXvoLedCL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cEuqUZ3CXvoLedCL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cEuqUZ3CXvoLedCL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cEuqUZ3CXvoLedCL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cEuqUZ3CXvoLedCL .marker.cross{stroke:#333333;}#mermaid-svg-cEuqUZ3CXvoLedCL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cEuqUZ3CXvoLedCL p{margin:0;}#mermaid-svg-cEuqUZ3CXvoLedCL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cEuqUZ3CXvoLedCL .cluster-label text{fill:#333;}#mermaid-svg-cEuqUZ3CXvoLedCL .cluster-label span{color:#333;}#mermaid-svg-cEuqUZ3CXvoLedCL .cluster-label span p{background-color:transparent;}#mermaid-svg-cEuqUZ3CXvoLedCL .label text,#mermaid-svg-cEuqUZ3CXvoLedCL span{fill:#333;color:#333;}#mermaid-svg-cEuqUZ3CXvoLedCL .node rect,#mermaid-svg-cEuqUZ3CXvoLedCL .node circle,#mermaid-svg-cEuqUZ3CXvoLedCL .node ellipse,#mermaid-svg-cEuqUZ3CXvoLedCL .node polygon,#mermaid-svg-cEuqUZ3CXvoLedCL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cEuqUZ3CXvoLedCL .rough-node .label text,#mermaid-svg-cEuqUZ3CXvoLedCL .node .label text,#mermaid-svg-cEuqUZ3CXvoLedCL .image-shape .label,#mermaid-svg-cEuqUZ3CXvoLedCL .icon-shape .label{text-anchor:middle;}#mermaid-svg-cEuqUZ3CXvoLedCL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cEuqUZ3CXvoLedCL .rough-node .label,#mermaid-svg-cEuqUZ3CXvoLedCL .node .label,#mermaid-svg-cEuqUZ3CXvoLedCL .image-shape .label,#mermaid-svg-cEuqUZ3CXvoLedCL .icon-shape .label{text-align:center;}#mermaid-svg-cEuqUZ3CXvoLedCL .node.clickable{cursor:pointer;}#mermaid-svg-cEuqUZ3CXvoLedCL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cEuqUZ3CXvoLedCL .arrowheadPath{fill:#333333;}#mermaid-svg-cEuqUZ3CXvoLedCL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cEuqUZ3CXvoLedCL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cEuqUZ3CXvoLedCL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cEuqUZ3CXvoLedCL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cEuqUZ3CXvoLedCL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cEuqUZ3CXvoLedCL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cEuqUZ3CXvoLedCL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cEuqUZ3CXvoLedCL .cluster text{fill:#333;}#mermaid-svg-cEuqUZ3CXvoLedCL .cluster span{color:#333;}#mermaid-svg-cEuqUZ3CXvoLedCL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cEuqUZ3CXvoLedCL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cEuqUZ3CXvoLedCL rect.text{fill:none;stroke-width:0;}#mermaid-svg-cEuqUZ3CXvoLedCL .icon-shape,#mermaid-svg-cEuqUZ3CXvoLedCL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cEuqUZ3CXvoLedCL .icon-shape p,#mermaid-svg-cEuqUZ3CXvoLedCL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cEuqUZ3CXvoLedCL .icon-shape .label rect,#mermaid-svg-cEuqUZ3CXvoLedCL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cEuqUZ3CXvoLedCL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cEuqUZ3CXvoLedCL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cEuqUZ3CXvoLedCL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 存储层
日志管理层
日志收集层
应用层
Nginx/Apache
MySQL/PostgreSQL
自定义应用
Systemd服务
直接写入

/var/log/xxx.log
rsyslog/syslog-ng
systemd-journald
logrotate

文本日志轮转
journald自管理

二进制日志清理
/var/log/*.log

文本文件
/var/log/journal/

二进制文件
归档/压缩文件

.gz/.bz2

关键认知logrotate 管理的是文本日志文件 (如Nginx的access.log、MySQL的error.log),而 systemd-journald 管理的是二进制结构化日志 (位于 /var/log/journal/)。两者职责分离,不可互相替代。

2.2 logrotate 工作流程详解

logrotate通过定时任务(cron)每天自动执行,完整流程如下:
#mermaid-svg-XnBycqWppOmbboxq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XnBycqWppOmbboxq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XnBycqWppOmbboxq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XnBycqWppOmbboxq .error-icon{fill:#552222;}#mermaid-svg-XnBycqWppOmbboxq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XnBycqWppOmbboxq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XnBycqWppOmbboxq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XnBycqWppOmbboxq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XnBycqWppOmbboxq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XnBycqWppOmbboxq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XnBycqWppOmbboxq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XnBycqWppOmbboxq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XnBycqWppOmbboxq .marker.cross{stroke:#333333;}#mermaid-svg-XnBycqWppOmbboxq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XnBycqWppOmbboxq p{margin:0;}#mermaid-svg-XnBycqWppOmbboxq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XnBycqWppOmbboxq .cluster-label text{fill:#333;}#mermaid-svg-XnBycqWppOmbboxq .cluster-label span{color:#333;}#mermaid-svg-XnBycqWppOmbboxq .cluster-label span p{background-color:transparent;}#mermaid-svg-XnBycqWppOmbboxq .label text,#mermaid-svg-XnBycqWppOmbboxq span{fill:#333;color:#333;}#mermaid-svg-XnBycqWppOmbboxq .node rect,#mermaid-svg-XnBycqWppOmbboxq .node circle,#mermaid-svg-XnBycqWppOmbboxq .node ellipse,#mermaid-svg-XnBycqWppOmbboxq .node polygon,#mermaid-svg-XnBycqWppOmbboxq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XnBycqWppOmbboxq .rough-node .label text,#mermaid-svg-XnBycqWppOmbboxq .node .label text,#mermaid-svg-XnBycqWppOmbboxq .image-shape .label,#mermaid-svg-XnBycqWppOmbboxq .icon-shape .label{text-anchor:middle;}#mermaid-svg-XnBycqWppOmbboxq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XnBycqWppOmbboxq .rough-node .label,#mermaid-svg-XnBycqWppOmbboxq .node .label,#mermaid-svg-XnBycqWppOmbboxq .image-shape .label,#mermaid-svg-XnBycqWppOmbboxq .icon-shape .label{text-align:center;}#mermaid-svg-XnBycqWppOmbboxq .node.clickable{cursor:pointer;}#mermaid-svg-XnBycqWppOmbboxq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XnBycqWppOmbboxq .arrowheadPath{fill:#333333;}#mermaid-svg-XnBycqWppOmbboxq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XnBycqWppOmbboxq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XnBycqWppOmbboxq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XnBycqWppOmbboxq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XnBycqWppOmbboxq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XnBycqWppOmbboxq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XnBycqWppOmbboxq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XnBycqWppOmbboxq .cluster text{fill:#333;}#mermaid-svg-XnBycqWppOmbboxq .cluster span{color:#333;}#mermaid-svg-XnBycqWppOmbboxq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XnBycqWppOmbboxq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XnBycqWppOmbboxq rect.text{fill:none;stroke-width:0;}#mermaid-svg-XnBycqWppOmbboxq .icon-shape,#mermaid-svg-XnBycqWppOmbboxq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XnBycqWppOmbboxq .icon-shape p,#mermaid-svg-XnBycqWppOmbboxq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XnBycqWppOmbboxq .icon-shape .label rect,#mermaid-svg-XnBycqWppOmbboxq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XnBycqWppOmbboxq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XnBycqWppOmbboxq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XnBycqWppOmbboxq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 满足条件
不满足
定时触发

/etc/cron.daily/logrotate
加载配置

/etc/logrotate.conf

/etc/logrotate.d/*
检查轮转条件
执行轮转操作
跳过本次执行
重命名旧日志

access.log → access.log.1
压缩归档

access.log.1 → access.log.1.gz
创建新日志文件

create 0640 user group
执行postrotate脚本

kill -HUP/kill -USR1
清理超期日志

按rotate/maxage删除
记录状态

/var/lib/logrotate/status

详细步骤解析

  1. 定时触发 :由 /etc/cron.daily/logrotate 脚本调度,通常每日凌晨执行
  2. 加载配置 :读取 /etc/logrotate.conf 主配置和 /etc/logrotate.d/* 子配置
  3. 检查条件:判断日志是否满足轮转条件(时间周期、文件大小、文件年龄)
  4. 执行轮转
    • 重命名旧日志(如 access.logaccess.log.1
    • 若启用 dateext,则附加日期后缀(如 access.log-20250609
    • 压缩归档(如 access.log.1.gz
    • 创建新的空日志文件(create 选项指定权限和属主)
  5. 执行钩子脚本postrotate 块中发送信号通知应用重新打开日志文件
  6. 清理超期日志 :按 rotate 保留数量或 maxage 天数删除旧文件
  7. 记录状态 :更新 /var/lib/logrotate/status 状态文件

2.3 两种轮转机制对比

logrotate提供两种根本不同的日志轮转方案:
#mermaid-svg-QdVahLbij1ZweoJV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QdVahLbij1ZweoJV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QdVahLbij1ZweoJV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QdVahLbij1ZweoJV .error-icon{fill:#552222;}#mermaid-svg-QdVahLbij1ZweoJV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QdVahLbij1ZweoJV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QdVahLbij1ZweoJV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QdVahLbij1ZweoJV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QdVahLbij1ZweoJV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QdVahLbij1ZweoJV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QdVahLbij1ZweoJV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QdVahLbij1ZweoJV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QdVahLbij1ZweoJV .marker.cross{stroke:#333333;}#mermaid-svg-QdVahLbij1ZweoJV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QdVahLbij1ZweoJV p{margin:0;}#mermaid-svg-QdVahLbij1ZweoJV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QdVahLbij1ZweoJV .cluster-label text{fill:#333;}#mermaid-svg-QdVahLbij1ZweoJV .cluster-label span{color:#333;}#mermaid-svg-QdVahLbij1ZweoJV .cluster-label span p{background-color:transparent;}#mermaid-svg-QdVahLbij1ZweoJV .label text,#mermaid-svg-QdVahLbij1ZweoJV span{fill:#333;color:#333;}#mermaid-svg-QdVahLbij1ZweoJV .node rect,#mermaid-svg-QdVahLbij1ZweoJV .node circle,#mermaid-svg-QdVahLbij1ZweoJV .node ellipse,#mermaid-svg-QdVahLbij1ZweoJV .node polygon,#mermaid-svg-QdVahLbij1ZweoJV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QdVahLbij1ZweoJV .rough-node .label text,#mermaid-svg-QdVahLbij1ZweoJV .node .label text,#mermaid-svg-QdVahLbij1ZweoJV .image-shape .label,#mermaid-svg-QdVahLbij1ZweoJV .icon-shape .label{text-anchor:middle;}#mermaid-svg-QdVahLbij1ZweoJV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QdVahLbij1ZweoJV .rough-node .label,#mermaid-svg-QdVahLbij1ZweoJV .node .label,#mermaid-svg-QdVahLbij1ZweoJV .image-shape .label,#mermaid-svg-QdVahLbij1ZweoJV .icon-shape .label{text-align:center;}#mermaid-svg-QdVahLbij1ZweoJV .node.clickable{cursor:pointer;}#mermaid-svg-QdVahLbij1ZweoJV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QdVahLbij1ZweoJV .arrowheadPath{fill:#333333;}#mermaid-svg-QdVahLbij1ZweoJV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QdVahLbij1ZweoJV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QdVahLbij1ZweoJV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QdVahLbij1ZweoJV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QdVahLbij1ZweoJV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QdVahLbij1ZweoJV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QdVahLbij1ZweoJV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QdVahLbij1ZweoJV .cluster text{fill:#333;}#mermaid-svg-QdVahLbij1ZweoJV .cluster span{color:#333;}#mermaid-svg-QdVahLbij1ZweoJV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QdVahLbij1ZweoJV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QdVahLbij1ZweoJV rect.text{fill:none;stroke-width:0;}#mermaid-svg-QdVahLbij1ZweoJV .icon-shape,#mermaid-svg-QdVahLbij1ZweoJV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QdVahLbij1ZweoJV .icon-shape p,#mermaid-svg-QdVahLbij1ZweoJV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QdVahLbij1ZweoJV .icon-shape .label rect,#mermaid-svg-QdVahLbij1ZweoJV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QdVahLbij1ZweoJV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QdVahLbij1ZweoJV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QdVahLbij1ZweoJV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 方案二: copytruncate (复制+截断)
原日志文件

access.log

inode: 1001
复制内容到

access.log.1

inode: 1002
截断原文件

access.log

inode: 1001 保留
应用继续写入原inode

无需重启/信号
可能丢失复制期间

的少量日志
方案一: create (重命名+创建新文件)
原日志文件

access.log

inode: 1001
重命名为

access.log.1

inode: 1001
创建新文件

access.log

inode: 1002
发送信号通知应用

重新打开日志文件
应用写入新inode

无数据丢失

方案一:create(默认方案)

原理:基于Linux文件系统的inode机制。重命名文件只修改目录项,不改变inode编号,因此应用进程通过原inode继续写入;创建同名新文件后,通过信号通知应用重新打开日志文件,此时应用通过文件路径打开的是新inode。

优点

  • 无数据丢失,操作近乎原子性
  • 支持压缩,节省磁盘空间
  • 标准做法,社区支持完善

缺点

  • 需要应用支持信号重载(如Nginx的USR1、Apache的HUP)
  • 若应用不支持,需重启服务,影响可用性
方案二:copytruncate

原理:先复制当前日志文件内容到归档文件,然后截断(清空)原文件。由于原文件的inode未改变,应用无需重新打开文件即可继续写入。

优点

  • 无需应用支持信号通知
  • 无需重启服务,对高可用场景友好

缺点

  • 存在竞争条件:复制和截断之间的极短时间内,新写入的日志会丢失
  • 大文件复制耗时较长,I/O开销大
  • 不适用于金融、医疗等对数据完整性要求极高的场景

适用场景:应用不支持日志重开信号,且允许极少量日志丢失的场景(如内部调试日志)。


三、配置文件体系详解

3.1 配置文件结构

#mermaid-svg-qxMyFfpuEjNY57iR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qxMyFfpuEjNY57iR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qxMyFfpuEjNY57iR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qxMyFfpuEjNY57iR .error-icon{fill:#552222;}#mermaid-svg-qxMyFfpuEjNY57iR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qxMyFfpuEjNY57iR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qxMyFfpuEjNY57iR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qxMyFfpuEjNY57iR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qxMyFfpuEjNY57iR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qxMyFfpuEjNY57iR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qxMyFfpuEjNY57iR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qxMyFfpuEjNY57iR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qxMyFfpuEjNY57iR .marker.cross{stroke:#333333;}#mermaid-svg-qxMyFfpuEjNY57iR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qxMyFfpuEjNY57iR p{margin:0;}#mermaid-svg-qxMyFfpuEjNY57iR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qxMyFfpuEjNY57iR .cluster-label text{fill:#333;}#mermaid-svg-qxMyFfpuEjNY57iR .cluster-label span{color:#333;}#mermaid-svg-qxMyFfpuEjNY57iR .cluster-label span p{background-color:transparent;}#mermaid-svg-qxMyFfpuEjNY57iR .label text,#mermaid-svg-qxMyFfpuEjNY57iR span{fill:#333;color:#333;}#mermaid-svg-qxMyFfpuEjNY57iR .node rect,#mermaid-svg-qxMyFfpuEjNY57iR .node circle,#mermaid-svg-qxMyFfpuEjNY57iR .node ellipse,#mermaid-svg-qxMyFfpuEjNY57iR .node polygon,#mermaid-svg-qxMyFfpuEjNY57iR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qxMyFfpuEjNY57iR .rough-node .label text,#mermaid-svg-qxMyFfpuEjNY57iR .node .label text,#mermaid-svg-qxMyFfpuEjNY57iR .image-shape .label,#mermaid-svg-qxMyFfpuEjNY57iR .icon-shape .label{text-anchor:middle;}#mermaid-svg-qxMyFfpuEjNY57iR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qxMyFfpuEjNY57iR .rough-node .label,#mermaid-svg-qxMyFfpuEjNY57iR .node .label,#mermaid-svg-qxMyFfpuEjNY57iR .image-shape .label,#mermaid-svg-qxMyFfpuEjNY57iR .icon-shape .label{text-align:center;}#mermaid-svg-qxMyFfpuEjNY57iR .node.clickable{cursor:pointer;}#mermaid-svg-qxMyFfpuEjNY57iR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qxMyFfpuEjNY57iR .arrowheadPath{fill:#333333;}#mermaid-svg-qxMyFfpuEjNY57iR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qxMyFfpuEjNY57iR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qxMyFfpuEjNY57iR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qxMyFfpuEjNY57iR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qxMyFfpuEjNY57iR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qxMyFfpuEjNY57iR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qxMyFfpuEjNY57iR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qxMyFfpuEjNY57iR .cluster text{fill:#333;}#mermaid-svg-qxMyFfpuEjNY57iR .cluster span{color:#333;}#mermaid-svg-qxMyFfpuEjNY57iR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qxMyFfpuEjNY57iR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qxMyFfpuEjNY57iR rect.text{fill:none;stroke-width:0;}#mermaid-svg-qxMyFfpuEjNY57iR .icon-shape,#mermaid-svg-qxMyFfpuEjNY57iR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qxMyFfpuEjNY57iR .icon-shape p,#mermaid-svg-qxMyFfpuEjNY57iR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qxMyFfpuEjNY57iR .icon-shape .label rect,#mermaid-svg-qxMyFfpuEjNY57iR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qxMyFfpuEjNY57iR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qxMyFfpuEjNY57iR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qxMyFfpuEjNY57iR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} /etc/logrotate.conf

主配置文件
全局默认设置
include /etc/logrotate.d
/etc/logrotate.d/nginx
/etc/logrotate.d/syslog
/etc/logrotate.d/mysql
/etc/logrotate.d/自定义应用
nginx专属规则

daily/rotate 14/compress
syslog专属规则

weekly/rotate 4/sharedscripts
mysql专属规则

size 100M/create 0640
应用专属规则

copytruncate/postrotate

  • 主配置文件 /etc/logrotate.conf:定义全局默认值
  • 子配置目录 /etc/logrotate.d/:每个服务独立的配置文件,通过 include 指令加载
  • 优先级:子配置中的参数会覆盖主配置的同名参数

3.2 主配置文件典型示例

bash 复制代码
# /etc/logrotate.conf
weekly                  # 默认每周轮转
rotate 4               # 默认保留4个旧日志
compress               # 默认启用压缩
delaycompress          # 延迟压缩(下次轮转时压缩上一次的)
missingok              # 日志不存在时不报错
notifempty             # 空日志不轮转
create 0640 root adm   # 默认创建新文件的权限和属主
include /etc/logrotate.d  # 加载子配置目录

# 针对特定文件的局部规则(覆盖全局设置)
/var/log/wtmp {
    monthly
    create 0664 root utmp
    minsize 1M
    rotate 1
}

3.3 核心配置参数速查表

参数 功能说明 示例
daily/weekly/monthly/yearly 轮转周期 daily
rotate N 保留N个旧日志文件 rotate 7
size 100M 超过指定大小时轮转 size 500M
minsize 50M 最小达到此大小才轮转 minsize 1M
maxage 30 删除超过30天的旧日志 maxage 365
compress 启用gzip压缩旧日志 compress
delaycompress 延迟一个周期压缩 delaycompress
missingok 日志不存在时不报错 missingok
notifempty 空文件不轮转 notifempty
create 0640 user group 创建新文件并设置权限 create 0640 www-data adm
dateext 使用日期作为后缀 dateext
dateformat -%Y%m%d 自定义日期格式 dateformat -%Y%m%d-%s
copytruncate 复制并截断原文件 copytruncate
olddir /backup/logs 归档到指定目录 olddir /var/log/archive
sharedscripts 多个日志共享一次脚本 sharedscripts
prerotate...endscript 轮转前执行脚本 见下方示例
postrotate...endscript 轮转后执行脚本 见下方示例
su user group 以指定用户身份执行 su root syslog

四、生产环境配置实战

4.1 Nginx 日志轮转配置

bash 复制代码
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily                    # 每日轮转
    missingok                # 日志缺失不报错
    rotate 14                # 保留14天
    compress                 # 启用压缩
    delaycompress            # 延迟压缩(确保Nginx有时间切换)
    notifempty               # 空文件不轮转
    create 0640 www-data adm # 创建新文件权限
    sharedscripts            # 所有日志轮转后只执行一次脚本
    postrotate
        # 向Nginx主进程发送USR1信号,使其重新打开日志文件
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

关键点

  • delaycompress 确保Nginx在收到USR1信号后,有时间将剩余内容写入旧日志文件,避免压缩不完整的日志
  • sharedscripts 避免对access.log和error.log分别执行reload,减少服务抖动

4.2 系统日志(rsyslog)轮转配置

bash 复制代码
# /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts
    postrotate
        # 重新加载rsyslog配置(HUP信号)
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

4.3 高频日志(按大小触发)

bash 复制代码
# /etc/logrotate.d/high-frequency-app
/var/log/myapp/*.log {
    size 100M                # 超过100MB立即轮转(不等daily)
    rotate 30                # 保留30个(约3GB总量控制)
    compress
    missingok
    notifempty
    create 0644 appuser appgroup
    dateext
    dateformat -%Y%m%d-%H%M%S  # 带时间戳,精确到秒
    sharedscripts
    postrotate
        # 可选:轮转后触发日志分析或上传
        /usr/local/bin/process_rotated_logs.sh $1
    endscript
}

4.4 Java应用(copytruncate方案)

bash 复制代码
# /etc/logrotate.d/java-app
/var/log/java-app/*.log {
    daily
    rotate 7
    size 500M
    compress
    missingok
    notifempty
    copytruncate             # 无需重启JVM
    create 0644 appuser appgroup
}

注意 :Java应用通常不支持信号重载日志文件,使用 copytruncate 是常见做法,但需接受极少量日志丢失的风险。

4.5 安全敏感日志配置

bash 复制代码
# /etc/logrotate.d/secure-logs
/var/log/audit/*.log {
    daily
    rotate 90              # 保留90天,满足合规要求
    compress
    delaycompress
    missingok
    notifempty
    create 0600 root root  # 严格权限,仅root可读写
    shred                  # 使用shred安全删除(覆盖后删除)
    shredcycles 3          # 覆盖3次
    olddir /var/log/audit/archive  # 归档到独立目录
    
    prerotate
        # 轮转前解除不可变属性(如有)
        /usr/bin/chattr -a /var/log/audit/*.log 2>/dev/null || true
    endscript
    
    postrotate
        # 轮转后恢复不可变属性
        /usr/bin/chattr +a /var/log/audit/*.log 2>/dev/null || true
    endscript
}

五、高级机制深度解析

5.1 状态文件(status)机制

#mermaid-svg-JReFW2YLV1vDNTZJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JReFW2YLV1vDNTZJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JReFW2YLV1vDNTZJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JReFW2YLV1vDNTZJ .error-icon{fill:#552222;}#mermaid-svg-JReFW2YLV1vDNTZJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JReFW2YLV1vDNTZJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JReFW2YLV1vDNTZJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JReFW2YLV1vDNTZJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JReFW2YLV1vDNTZJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JReFW2YLV1vDNTZJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JReFW2YLV1vDNTZJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JReFW2YLV1vDNTZJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JReFW2YLV1vDNTZJ .marker.cross{stroke:#333333;}#mermaid-svg-JReFW2YLV1vDNTZJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JReFW2YLV1vDNTZJ p{margin:0;}#mermaid-svg-JReFW2YLV1vDNTZJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JReFW2YLV1vDNTZJ .cluster-label text{fill:#333;}#mermaid-svg-JReFW2YLV1vDNTZJ .cluster-label span{color:#333;}#mermaid-svg-JReFW2YLV1vDNTZJ .cluster-label span p{background-color:transparent;}#mermaid-svg-JReFW2YLV1vDNTZJ .label text,#mermaid-svg-JReFW2YLV1vDNTZJ span{fill:#333;color:#333;}#mermaid-svg-JReFW2YLV1vDNTZJ .node rect,#mermaid-svg-JReFW2YLV1vDNTZJ .node circle,#mermaid-svg-JReFW2YLV1vDNTZJ .node ellipse,#mermaid-svg-JReFW2YLV1vDNTZJ .node polygon,#mermaid-svg-JReFW2YLV1vDNTZJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JReFW2YLV1vDNTZJ .rough-node .label text,#mermaid-svg-JReFW2YLV1vDNTZJ .node .label text,#mermaid-svg-JReFW2YLV1vDNTZJ .image-shape .label,#mermaid-svg-JReFW2YLV1vDNTZJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-JReFW2YLV1vDNTZJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JReFW2YLV1vDNTZJ .rough-node .label,#mermaid-svg-JReFW2YLV1vDNTZJ .node .label,#mermaid-svg-JReFW2YLV1vDNTZJ .image-shape .label,#mermaid-svg-JReFW2YLV1vDNTZJ .icon-shape .label{text-align:center;}#mermaid-svg-JReFW2YLV1vDNTZJ .node.clickable{cursor:pointer;}#mermaid-svg-JReFW2YLV1vDNTZJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JReFW2YLV1vDNTZJ .arrowheadPath{fill:#333333;}#mermaid-svg-JReFW2YLV1vDNTZJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JReFW2YLV1vDNTZJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JReFW2YLV1vDNTZJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JReFW2YLV1vDNTZJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JReFW2YLV1vDNTZJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JReFW2YLV1vDNTZJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JReFW2YLV1vDNTZJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JReFW2YLV1vDNTZJ .cluster text{fill:#333;}#mermaid-svg-JReFW2YLV1vDNTZJ .cluster span{color:#333;}#mermaid-svg-JReFW2YLV1vDNTZJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JReFW2YLV1vDNTZJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JReFW2YLV1vDNTZJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-JReFW2YLV1vDNTZJ .icon-shape,#mermaid-svg-JReFW2YLV1vDNTZJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JReFW2YLV1vDNTZJ .icon-shape p,#mermaid-svg-JReFW2YLV1vDNTZJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JReFW2YLV1vDNTZJ .icon-shape .label rect,#mermaid-svg-JReFW2YLV1vDNTZJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JReFW2YLV1vDNTZJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JReFW2YLV1vDNTZJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JReFW2YLV1vDNTZJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 状态文件

/var/lib/logrotate/status
格式: 路径 日期
/var/log/nginx/access.log 2026-6-9
/var/log/syslog 2026-6-8
/var/log/mysql/error.log 2026-6-9
作用
记录上次轮转时间
防止重复轮转
支持force强制覆盖

logrotate通过 /var/lib/logrotate/status 记录每个日志文件的上次轮转日期,确保:

  • 防重复:同一天不会重复轮转同一日志
  • 状态持久:即使系统重启,也能正确判断是否需要轮转
  • 手动干预 :可通过 -s 指定自定义状态文件,或删除状态文件强制重新评估

5.2 prerotate 与 postrotate 脚本机制

这两个钩子脚本是logrotate最强大的扩展能力:

  • prerotate :在轮转之前执行。常用于:

    • 解除文件特殊属性(如 chattr -a
    • 备份当前日志到远程服务器
    • 停止相关服务(极端场景)
  • postrotate :在轮转之后执行。常用于:

    • 发送信号通知应用重新打开日志(kill -HUP / kill -USR1
    • 恢复文件特殊属性(如 chattr +a
    • 触发日志分析、上传、告警
  • sharedscripts :当配置块匹配多个日志文件时,确保脚本只执行一次而非每个文件都执行。这对Nginx等多日志场景至关重要,避免多次reload服务。

5.3 与 systemd-journald 的协同与区别

对比维度 logrotate systemd-journald
管理对象 文本日志文件(.log) 二进制结构化日志(.journal)
存储位置 /var/log/*.log /var/log/journal/
日志格式 纯文本,人类可读 二进制,需journalctl查看
触发机制 cron定时(通常每日) 实时写入,自动按大小/时间清理
配置方式 /etc/logrotate.conf /etc/systemd/journald.conf
压缩能力 支持(gzip/bzip2) 内置压缩
查询能力 grep/awk等文本工具 journalctl结构化查询
适用场景 应用自定义日志、传统syslog systemd服务日志、系统启动日志

核心结论 :两者是互补关系而非替代关系。生产环境中,journald管理systemd体系日志,logrotate管理独立文本日志,rsyslog在需要时做中转和持久化。


六、调试与故障排查

6.1 常用命令

bash 复制代码
# 调试模式:模拟执行,不真正轮转(强烈推荐配置后先测试)
logrotate -d /etc/logrotate.d/nginx

# 强制轮转:立即执行(谨慎使用)
logrotate -f /etc/logrotate.d/nginx

# 详细模式:显示执行过程
logrotate -vf /etc/logrotate.d/nginx

# 查看状态文件
cat /var/lib/logrotate/status

# 检查cron任务是否正常
ls -la /etc/cron.daily/logrotate
cat /etc/cron.daily/logrotate

6.2 常见问题排查

现象 可能原因 解决方案
日志未轮转 cron未执行/配置错误 检查cron服务;手动执行测试
轮转后服务不写入新日志 postrotate信号未生效 验证PID文件路径;检查信号类型
权限拒绝 文件属主/权限不匹配 调整 create 参数或 su 参数
旧日志未删除 rotate数量设置过大 检查 rotatemaxage 配置
copytruncate后日志有乱码 应用未使用O_APPEND打开文件 改用create方案,或修改应用
状态文件损坏 异常断电/磁盘故障 删除 /var/lib/logrotate/status 后重建

七、生产环境最佳实践

7.1 权限与安全

  • 日志文件权限 :常规日志设为 640(属主可写,组可读,其他无权限);敏感日志(如认证、支付)设为 600
  • 防止误删 :对关键日志使用 chattr +a(仅追加属性),在 prerotate 中临时解除,postrotate 中恢复
  • 敏感信息脱敏:严禁在日志中输出密码、Token、身份证号等,应用层应实现脱敏
  • 安全删除 :对审计日志启用 shred 选项,防止恢复

7.2 性能优化

  • 高频日志 :使用 size 触发而非纯时间触发,避免单文件过大
  • I/O错峰:将logrotate执行时间调整到业务低峰期(如凌晨3:00)
  • 独立分区 :使用 olddir 将归档日志存储到独立分区或挂载点,避免影响根分区
  • 延迟压缩 :对正在写入的日志使用 delaycompress,避免压缩不完整的文件

7.3 监控与告警

bash 复制代码
# 检查磁盘使用情况
df -h /var/log
du -sh /var/log/* | sort -hr

# 检查logrotate执行状态(查看系统日志)
grep logrotate /var/log/syslog
grep logrotate /var/log/messages

# 检查特定日志的轮转历史
ls -lt /var/log/nginx/access.log*

7.4 与集中式日志平台集成

bash 复制代码
# 示例:轮转后触发Logstash处理
/var/log/app/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0644 appuser appgroup
    postrotate
        # 通知Logstash重新加载配置或处理新文件
        curl -XPOST http://logstash:9600/_node/reload 2>/dev/null || true
    endscript
}

八、总结

logrotate是Linux日志管理的基石工具,其设计哲学是**"配置即策略,自动化运维"**。掌握其核心要点:

  1. 理解双层架构:logrotate管文本,journald管二进制,各司其职
  2. 选对轮转方案 :优先 create + 信号通知,不得已再用 copytruncate
  3. 善用钩子脚本prerotate/postrotate 是实现复杂日志管理逻辑的关键
  4. 重视安全与权限:最小权限原则,敏感日志严格管控
  5. 先调试再上线-d 调试模式是避免生产事故的最佳保险

通过合理配置logrotate,可以确保日志既不会撑爆磁盘,又能在需要时快速定位问题,实现 "有日志可查,无冗余之患" 的运维理想状态。

相关推荐
ggaofeng1 小时前
如何通过uboot加载硬盘
linux·qemu·uboot
尔染君子1 小时前
嵌入式Linux驱动开发(按键驱动)
linux·驱动开发
条俐开水喉1 小时前
液冷服务器与U位资产管理的依存共生关系深度分析
运维·ai算力服务器·u位资产管理·液冷服务器
kebidaixu2 小时前
BCU 平台 Modbus 主机功能开发:液冷机组 & 消防传感器
linux
高旭的旭2 小时前
反向 SSH 隧道远程方案
运维·ssh
元启数宇2 小时前
机电设计AI不只是消防:给排水、暖通、强弱电如何进入自动化?
运维·人工智能·自动化
vsropy2 小时前
安装虚拟机VMware
linux·windows
Jason_chen2 小时前
Linux 3.0 串口机制深度解析:传统8250驱动与基础RS-232/485支持
linux·前端
CHrisFC2 小时前
LIMS 系统 AI 建设路径:从自动化到智能化的演进之路
运维·人工智能·自动化