使用logrotate实现日志轮转

news2025/4/24 20:16:34

logrotate 是一个强大的 Linux 工具,用于自动化管理日志文件的轮转、压缩、删除和归档。它能有效防止日志文件无限增长,节省磁盘空间,同时保持日志的可追溯性。以下是详细讲解 logrotate 的用法,涵盖安装、配置、测试、自动化、常见问题及高级功能。


1. 什么是 logrotate

logrotate 是一个系统级工具,用于:

  • 按时间(每天、每周、每月)或大小轮转日志文件。
  • 压缩旧日志文件(如生成 .gz.xz 文件)。
  • 删除过旧的日志文件以释放空间。
  • 在轮转后通知应用程序重新打开新日志文件。
  • 支持自定义脚本执行额外操作(如重启服务)。

它广泛用于管理系统日志(如 /var/log/syslog)和应用日志(如 Nginx、Apache、自定义应用日志)。


2. 安装 logrotate

大多数 Linux 发行版(如 Ubuntu、CentOS、Debian)默认预装 logrotate。若未安装,可手动安装:

  • Ubuntu/Debian
sudo apt update
sudo apt install logrotate
  • CentOS/RHEL
sudo yum install logrotate
  • 验证安装:
logrotate --version

输出类似:

logrotate 3.18.0

3. logrotate 的工作机制

  • 配置文件
    • 主配置文件:/etc/logrotate.conf,定义全局轮转规则。
    • 子配置文件:/etc/logrotate.d/ 目录下的文件,定义特定日志的轮转规则。
  • 调度执行
    logrotate 通常通过 cronsystemd 定时任务每天运行,检查并执行轮转。
  • 轮转流程
    1. 检查日志文件是否满足轮转条件(时间或大小)。
    2. 重命名旧日志文件(如 app.log 变为 app.log.1)。
    3. 创建新日志文件。
    4. 压缩旧日志(如生成 app.log.1.gz)。
    5. 删除超出保留周期的日志。
    6. 执行自定义脚本(如通知应用程序)。

4. 配置文件详解

logrotate 的配置由全局配置和子配置组成,格式为纯文本,包含日志文件路径和轮转指令。

4.1 主配置文件

/etc/logrotate.conf 定义全局默认规则,示例:

weekly
rotate 4
create
compress
include /etc/logrotate.d
/var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
}
  • weekly:默认每周轮转一次。
  • rotate 4:保留 4 个历史日志文件。
  • create:轮转后创建新日志文件。
  • compress:压缩旧日志文件(默认使用 gzip)。
  • include /etc/logrotate.d:包含 /etc/logrotate.d/ 下的子配置文件。
  • /var/log/wtmp { … }:为特定日志文件定义轮转规则。

4.2 子配置文件

子配置文件存放在 /etc/logrotate.d/,每个文件针对特定应用或日志。例如,为自定义应用日志 /var/log/myapp.log 创建轮转规则:

/var/log/myapp.log {
    daily
    rotate 7
    size 100M
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
    postrotate
        /bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
配置项说明:
  • /var/log/myapp.log:要轮转的日志文件路径,支持通配符(如 /var/log/myapp/*.log)。
  • daily:每天轮转(其他选项:weeklymonthly)。
  • rotate 7:保留 7 个历史日志文件(如 myapp.log.1.gzmyapp.log.7.gz)。
  • size 100M:当日志文件超过 100MB 时触发轮转(支持 KMG 单位)。
  • compress:压缩旧日志文件。
  • delaycompress:延迟压缩到下一次轮转(即 myapp.log.1 不压缩,myapp.log.2 开始压缩)。
  • missingok:如果日志文件不存在,不报错。
  • notifempty:如果日志文件为空,不轮转。
  • create 0640 root root:轮转后创建新文件,权限为 0640,属主和属组为 root
  • postrotate … endscript:轮转后执行脚本,这里发送 HUP 信号通知进程重新打开日志文件。
  • || true:确保脚本即使失败也不会影响 logrotate 继续运行。

4.3 保存子配置文件

创建文件:

sudo nano /etc/logrotate.d/myapp

粘贴上述配置,保存并退出。确保文件权限正确:

sudo chmod 644 /etc/logrotate.d/myapp

5. 常用配置选项

以下是 logrotate 支持的常用指令:

  • 时间控制
    • daily:每天轮转。
    • weekly:每周轮转。
    • monthly:每月轮转。
  • 大小控制
    • size 100M:文件超过指定大小触发轮转。
    • maxsize 500M:即使未到时间周期,超过此大小也轮转。
  • 文件管理
    • rotate <n>:保留 <n> 个历史日志。
    • create <mode> <owner> <group>:创建新文件的权限、属主、属组。
    • nocreate:不创建新文件。
    • missingok:日志文件缺失不报错。
    • notifempty:空文件不轮转。
  • 压缩
    • compress:启用压缩。
    • nocompress:禁用压缩。
    • delaycompress:延迟压缩。
    • compresscmd /usr/bin/xz:使用 xz 压缩。
    • compressext .xz:压缩文件后缀。
  • 脚本执行
    • prerotate/endscript:轮转前执行脚本。
    • postrotate/endscript:轮转后执行脚本。
    • firstaction/endscript:在处理一组日志前执行一次。
    • lastaction/endscript:在处理一组日志后执行一次。
  • 其他
    • mail user@example.com:将轮转的日志发送到指定邮箱。
    • olddir /path/to/archive:将旧日志移动到指定目录。
    • maxage 30:删除超过 30 天的旧日志。

6. 测试 logrotate 配置

在生产环境操作前,测试配置以确保无误:

  • 调试模式
sudo logrotate -d /etc/logrotate.conf
  • -d:模拟轮转过程,显示详细日志但不实际修改文件。

  • 检查输出,确认规则是否按预期应用。

  • 强制执行

sudo logrotate -f /etc/logrotate.conf
  • -f:强制执行轮转,立即应用规则。

  • 检查 /var/log/,确认是否生成新日志文件(如 myapp.log)和压缩文件(如 myapp.log.1.gz)。

  • 针对单一配置文件测试

sudo logrotate -d /etc/logrotate.d/myapp

7. 自动化轮转

logrotate 通常通过定时任务自动运行:

  • Cron 调度
    默认每天运行 /etc/cron.daily/logrotate。查看脚本:
cat /etc/cron.daily/logrotate

示例内容:

#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

确保 cron 服务运行:

sudo systemctl status cron
  • Systemd 定时器(现代系统):
    部分系统使用 systemd 替代 cron。检查定时器:
systemctl status logrotate.timer

启用定时器:

sudo systemctl enable logrotate.timer
sudo systemctl start logrotate.timer
  • 自定义调度
    如果需要更频繁的轮转,创建自定义 cron 任务:
sudo crontab -e

添加(每小时运行):

0 * * * * /usr/sbin/logrotate /etc/logrotate.conf

8. 实际应用示例

以下是针对不同场景的配置示例:

8.1 Nginx 日志轮转

为 Nginx 的访问日志和错误日志配置轮转:

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx adm
    sharedscripts
    postrotate
        /usr/sbin/nginx -s reopen
    endscript
}
  • sharedscripts:对一组日志只执行一次脚本(避免通配符重复执行)。
  • nginx -s reopen:通知 Nginx 重新打开日志文件。

8.2 按大小轮转大型日志

为快速增长的日志配置大小触发:

/var/log/bigapp.log {
    size 500M
    rotate 5
    compress
    create 0640 root root
    postrotate
        /bin/kill -HUP `cat /var/run/bigapp.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

8.3 归档到指定目录

将旧日志移动到归档目录:

/var/log/myapp.log {
    daily
    rotate 7
    compress
    olddir /var/log/archive
    create 0640 root root
}

确保 /var/log/archive 存在且有写权限:

sudo mkdir -p /var/log/archive
sudo chown root:root /var/log/archive
sudo chmod 755 /var/log/archive

9. 常见问题与解决

  • 日志未轮转
    • 检查配置文件语法:
sudo logrotate -d /etc/logrotate.conf
  • 确认定时任务运行:
sudo systemctl status cron
  • 检查日志文件权限,确保 logrotate 可读写:
ls -l /var/log/myapp.log
  • 确认日志文件非空(若配置了 notifempty)。

  • 进程未重新打开日志文件

    • 验证 postrotate 脚本是否正确。例如,检查进程 PID 文件:
cat /var/run/myapp.pid
  • 确认信号(如 HUP)对应用有效,参考应用文档。

  • 压缩文件占用过多空间

    • 减少 rotate 值或启用更高压缩率:
compresscmd /usr/bin/xz
compressext .xz
  • 删除旧日志:
maxage 30
  • 权限错误

    • 确保 create 指定的用户和组存在。
    • 检查 olddir 目录权限。
  • 调试日志
    logrotate 的运行日志记录在 /var/log/syslog/var/log/messages

grep logrotate /var/log/syslog

10. 高级功能

  • 多日志文件分组
    使用通配符处理多个日志:
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/myapp.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
  • 条件轮转
    结合 size 和时间:
/var/log/myapp.log {
    daily
    size 100M
    rotate 7
    compress
}

日志每天检查,若超过 100MB 或达到时间周期则轮转。

  • 邮件通知
    将轮转的日志发送到邮箱:
/var/log/myapp.log {
    daily
    rotate 7
    mail user@example.com
}
  • 状态文件
    logrotate 使用 /var/lib/logrotate/status 记录轮转状态,查看:
cat /var/lib/logrotate/status

若状态文件损坏,可删除后重建:

sudo rm /var/lib/logrotate/status
sudo logrotate -f /etc/logrotate.conf

11. 最佳实践

  • 测试配置:始终先用 -d 调试,避免生产环境错误。
  • 权限管理:设置合理的文件权限(如 0640),防止敏感日志泄露。
  • 日志归档:结合备份工具(如 Restic)定期归档压缩日志。
  • 监控磁盘:定期检查磁盘使用情况:
df -h /var/log
  • 文档参考:查阅 man logrotate 或 官方文档 获取更多细节。

12. 注意事项

  • 进程兼容性:某些应用(如 MySQL)需要特定重启命令,参考其文档。
  • 磁盘空间:确保 /var/logolddir 有足够空间。
  • 备份策略:轮转后立即备份压缩日志,防止意外删除。
  • 避免重复轮转:同一日志文件不要在多个配置文件中定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2341923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MQTTX + MCP:MQTT 客户端秒变物联网 Agent

引言&#xff1a;MQTTX 与 MCP 的融合 作为最受欢迎的 MQTT 客户端工具&#xff0c;MQTTX 在 1.12.0 beta 版本中集成了模型上下文协议&#xff08;MCP&#xff09;到 Copilot AI 功能中&#xff0c;显著提升了服务能力。这一融合让 MQTTX 转变为 MCP Host&#xff08;也就是发…

快手砍掉本地生活的门槛

一场本地商家的效率革命。 作者|景行 编辑|杨舟 “两斤鸡翅根七块九&#xff0c;两盒蓝莓九块钱&#xff0c;两公斤卫生纸十四块九一提。” 这是朝阳佳惠超市&#xff0c;在快手一则普通的短视频内容。 佳惠超市在辽宁省朝阳市有22家分店&#xff0c;打开佳惠超市的相关快手…

Python基础语法3

目录 1、函数 1.1、语法格式 1.2、函数返回值 1.3、变量作用域 1.4、执行过程 1.5、链式调用 1.6、嵌套调用 1.7、函数递归 1.8、参数默认值 1.9、关键字参数 2、列表 2.1、创建列表 2.2、下标访问 2.3、切片操作 2.4、遍历列表元素 2.5、新增元素 2.6、查找元…

【AI】Windows环境安装SPAR3D单图三维重建心得

效果一览 左图为原始单个图像&#xff0c;右图为通过SPAR3D重建后的三维建模&#xff0c;可以看出效果还是不错的。 本地环境配置 系统&#xff1a;Windows 11 专业版CPU&#xff1a;i5-13400F内存&#xff1a;32GBGPU&#xff1a;RTX3060 12GBcuda&#xff1a;11.8conda&…

使用docker在manjaro linux系统上运行windows和ubuntu

因为最近项目必须要使用指定版本的solidworks和maxwell&#xff08;都只能在win系统上使用&#xff09;, 且目前的ubuntu容器是没有桌面的&#xff0c;导致我运行不了一些带图形的ros2功能。无奈之下&#xff0c;决定使用docker-compose写一下配置文件&#xff0c;彻底解决问题…

Redis(01)Redis连接报错Redis is running in protected mode……的解决方案

一、引言&#xff1a;从一个典型连接错误说起 在分布式系统开发中&#xff0c;Redis 作为高性能缓存中间件被广泛使用。 然而&#xff0c;当我们首次部署 Redis 并尝试从外部客户端连接时&#xff0c;常常会遇到以下错误&#xff1a; DENIED Redis is running in protected m…

18487.1-2015-解读笔记之四-交流充电之流程分析

前面简单分析了国标交流充电桩插枪监测逻辑和PWM控制逻辑&#xff0c;下面简单分析一下交流充电流程 附录A 交流充电连接过程和控制时序如下&#xff1a; 由此可以将充电流程大概分为几个阶段&#xff1a; 1.充电连接阶段 充电连接阶段CC&#xff08;电阻由无穷大到R4RC&…

Linux 管道理解

一、什么是管道 1.1 unix中最古老的进程间通信 1.2 一个进程链接到另一个进程的数据流称为“管道”&#xff1a; 图解&#xff1a; 二、管道通信的原理 2.1当我们创建一个进程然后打开一个文件的时候 会经过以下步骤&#xff1a; ①首先要描述这个进程&#xff0c;为这个…

国产RK3568+FPGA以 ‌“实时控制+高精度采集+灵活扩展”‌ 为核心的解决方案

RK3568FPGA方案在工业领域应用的核心优势 一、‌实时性与低延迟控制‌ ‌AMP架构与GPIO中断技术‌ 通过非对称多处理架构&#xff08;AMP&#xff09;实现Linux与实时操作系统&#xff08;RTOS/裸机&#xff09;协同&#xff0c;主核负责调度&#xff0c;从核通过GPIO中断响应紧…

Pycharm(十五)面向对象程序设计基础

目录 一、面向对象基本概述 class 类名: 属性(类似于定义变量) 行为(类似于定义函数,只不过第一个形参要写self) 二、self关键字介绍 三、在类内部调用类中的函数 四、属性的定义和调用 五、魔法方法init方法 六、魔法方法str和del方法 七、案例-减肥 一、…

华三(H3C)与华为(Huawei)设备配置IPsec VPN的详细说明,涵盖配置流程、参数设置及常见问题处理

以下是针对华三&#xff08;H3C&#xff09;与华为&#xff08;Huawei&#xff09;设备配置IPsec VPN的详细说明&#xff0c;涵盖配置流程、参数设置及常见问题处理&#xff1a; 一、华三&#xff08;H3C&#xff09;设备IPsec VPN配置详解 1. 配置流程 华三IPsec VPN配置主要…

店匠科技摘得 36 氪“2025 AI Partner 创新大奖”

全场景 AI 方案驱动跨境电商数智化跃迁 4 月 18 日,36 氪 2025 AI Partner 大会于上海盛大开幕。大会紧扣“Super App 来了”主题,全力探寻 AI 时代的全新变量,探索 AI 领域下一个超级应用的无限可能性。在此次大会上,跨境电商独立站 SaaS 平台店匠科技(Shoplazza)凭借“店匠跨…

Joint communication and state sensing under logarithmic loss

摘要——我们研究一种基本的联合通信与感知设置&#xff0c;其中发射机希望向接收机传输一条消息&#xff0c;并同时通过广义反馈估计其信道状态。我们假设感知目标是获得状态的软估计&#xff08;即概率分布&#xff09;&#xff0c;而非通常假设的点估计&#xff1b;并且我们…

Linux:41线程控制lesson29

1.线程的优点&#xff1a; • 创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多 创建好线程只要调度就好了 • 与进程之间的切换相⽐&#xff0c;线程之间的切换需要操作系统做的⼯作要少很多 为什么&#xff1f; ◦ 最主要的区别是线程的切换虚拟内存空间依然是相同的&#x…

HTMLCSS实现网页轮播图

网页中轮播图区域的实现与解析 在现代网页设计中&#xff0c;轮播图是一种常见且实用的元素&#xff0c;能够在有限的空间内展示多个内容&#xff0c;吸引用户的注意力。下面将对上述代码中轮播图区域的实现方式进行详细介绍。 一、HTML 结构 <div class"carousel-c…

Java基础第21天-正则表达式

正则表达式是对字符串执行模式匹配的技术 如果想灵活的运用正则表达式&#xff0c;必须了解其中各种元字符的功能&#xff0c;元字符从功能上大致分为&#xff1a; 限定符选择匹配符分组组合和反向引用符特殊字符字符匹配符定位符 转义号\\:在我们使用正则表达式去检索某些特…

CSGO 盲盒开箱系统技术实现深度解析

一、系统架构设计 &#xff08;一&#xff09;前后端分离架构 采用前后端分离模式&#xff0c;后端专注业务逻辑处理与数据管理&#xff0c;前端负责用户交互界面呈现。后端通过 RESTful API 与前端进行数据交互&#xff0c;这种架构能有效提高开发效率&#xff0c;便于团队分…

JS通过GetCapabilities获取wms服务元数据信息并在SuperMap iClient3D for WebGL进行叠加显示

获取wms服务元数据信息并在三维webgl客户端进行叠加显示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

7N60-ASEMI无人机专用功率器件7N60

编辑&#xff1a;LL 7N60-ASEMI无人机专用功率器件7N60 型号&#xff1a;7N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大漏源电流&#xff1a;7A 漏源击穿电压&#xff1a;600V 批号&#xff1a;最新 RDS&#xff08;ON&#xff09;Max&#xff1a;1.20Ω …

Pytorch图像数据转为Tensor张量

PyTorch的所有模型&#xff08;nn.Module&#xff09;都只接受Tensor格式的输入&#xff0c;所以我们在使用图像数据集时&#xff0c;必须将图像转换为Tensor格式。PyTorch提供了torchvision.transforms模块来处理图像数据集。torchvision.transforms模块提供了一些常用的图像预…