当前位置: 首页 > java >正文

Logrotate:配置日志轮转、高效管理Linux日志文件

Logrotate 是 Linux 系统中用于自动化管理日志文件的工具,能够定期轮转、压缩、删除日志文件,确保系统日志不会无限制增长,占用过多磁盘空间。
它通常由 Cron 作业定期执行,也可以手动触发。


1. 🔧 核心功能

  • 日志轮转:将当前日志文件重命名为备份文件,并创建新的空日志文件供应用程序继续写入。
  • 日志压缩:对过期的日志文件进行压缩,节省磁盘空间。
  • 日志删除:删除旧的日志文件,通常根据日志文件的数量或时间来确定是否删除。
  • 日志保留策略:配置保留的日志文件数量或保留的天数。

2. 📁 配置文件结构与常用指令

配置文件路径

  • 主配置文件/etc/logrotate.conf
  • 应用程序特定配置/etc/logrotate.d/ 目录下的各个配置文件

常用指令

指令说明示例
daily每天轮转日志daily
weekly每周轮转日志weekly
monthly每月轮转日志monthly
rotate <num>保留 <num> 个历史日志文件rotate 4
compress启用日志压缩,通常使用 gzip 格式compress
delaycompress延迟压缩,推迟到下一次轮转时再压缩delaycompress
create <mode> <owner> <group>创建新日志文件,指定权限、所有者和组create 0640 nginx adm
missingok如果日志文件丢失则不报错missingok
notifempty如果日志文件为空,则不进行轮转notifempty
postrotate ... endscript在日志轮转后执行的命令或脚本postrotate ... endscript

3. 📝 日志轮转策略与操作示例

示例配置1: Nginx 日志轮转

/var/log/nginx/*.log {dailymissingokrotate 14compressdelaycompressnotifemptycreate 0640 www-data admsharedscriptsprerotateif [ -d /etc/logrotate.d/httpd-prerotate ]; then \run-parts /etc/logrotate.d/httpd-prerotate; \fi \endscriptpostrotateinvoke-rc.d nginx rotate >/dev/null 2>&1endscript
}

配置说明

  • daily:指定日志按天轮转(每日凌晨触发一次轮转)。
  • missingok:若日志文件不存在,logrotate不报错,继续执行后续操作(避免因日志未生成而中断轮转)。
  • rotate 14:保留最近14个旧日志备份,超过14个的旧日志将被自动删除。
  • compress:对轮转后的旧日志进行压缩(使用gzip,生成.gz格式文件,节省磁盘空间)。
  • delaycompress延迟压缩旧日志,推迟到下一次轮转时再执行压缩(避免当前轮转的日志仍在被Nginx写入时压缩)。
  • notifempty:若日志文件为空,跳过轮转操作(不生成空的备份文件)。
  • create 0640 www-data adm
    • 轮转后创建新日志文件,权限为0640(所有者www-data可读可写,所属组adm可读,其他用户无权限)。
    • 所有者为www-data(Nginx服务在Ubuntu/Debian系统的默认运行用户),所属组为adm(系统管理组,通常用于日志管理)。
  • sharedscripts:当有多个日志文件需要轮转时(如access.logerror.log),prerotatepostrotate脚本仅执行一次(避免重复执行脚本)。
  • prerotate ... endscript
    • 日志轮转前执行的脚本
    • if [ -d /etc/logrotate.d/httpd-prerotate ]:检查是否存在httpd-prerotate目录(可能为兼容Apache日志预处理脚本,或系统预留的通用目录)。
    • run-parts:执行目录内的所有可执行脚本(通常用于在轮转前清理、检查或备份日志相关资源)。
  • postrotate ... endscript
    • 日志轮转后执行的脚本
    • invoke-rc.d nginx rotate:通过系统初始化脚本(invoke-rc.d)通知Nginx重新加载日志配置(等价于发送USR1信号,使Nginx停止写入旧日志,开始写入新创建的日志文件)。
    • >/dev/null 2>&1:将脚本执行的输出和错误重定向到空设备(静默执行,不输出任何信息)。

示例配置2:使用 copytruncate 的 uWSGI 日志轮转

以下是针对 uWSGI 应用程序的日志轮转配置示例,特别使用了 copytruncate 选项,以避免重启服务。

示例配置:

/home/ly/code/web_proj/log/myapp.log {dailyrotate 7missingoknotifemptycopytruncatedateextdateyesterdaydateformat -%Y%m%dsu ly ly
}

配置说明:

  • daily:每天轮转日志
  • rotate 7:保留最近 7 个日志文件
  • missingok:如果日志文件丢失则不报错
  • notifempty:如果日志文件为空,则不进行轮转
  • copytruncate:复制日志文件内容后清空原文件,适用于不支持重载信号的服务
  • dateext:使用日期作为日志文件的后缀
  • dateyesterday:使用昨天的日期,因为日志轮转发生在每天的午夜(00:00),这时已经是第二天的日期了
  • dateformat -%Y%m%d:指定日期格式为 -YYYYMMDD
  • su ly ly:以 ly 用户身份执行轮转操作

使用 copytruncate 后,uWSGI 无需重启即可继续写入新的日志文件,因此无需配置 postrotateendscript


4. 🧪 手动触发与调试 Logrotate

1. 检查配置文件的正确性(调试模式)

在进行实际的日志轮转之前,建议先使用调试模式检查配置文件是否正确。

命令:

sudo logrotate -d /etc/logrotate.d/uwsgi

说明:

  • -d:启用调试模式,模拟执行日志轮转,但不进行实际的文件操作。
  • -v:启用详细模式,提供更多的调试信息。

该命令将输出 Logrotate 将执行的操作步骤,包括哪些日志文件将被轮转、是否需要执行 postrotate 脚本等。

2. 强制执行日志轮转

如果调试模式显示配置正确,您可以使用以下命令强制执行日志轮转:

命令:

sudo logrotate -f /etc/logrotate.d/uwsgi

说明:

  • -f:强制执行日志轮转,即使日志文件未达到轮转条件(如大小、时间等)。

该命令将立即执行日志轮转,按照配置文件中的规则处理日志文件。

3. 查看日志轮转状态

Logrotate 会记录日志轮转的状态信息,您可以查看状态文件了解日志轮转的历史记录:

命令:

cat /var/lib/logrotate/status

说明:

该文件包含每个日志文件的最后一次轮转时间等信息。

在这里插入图片描述

4. 注意事项

  • 配置文件路径:确保在命令中使用正确的配置文件路径。
  • 权限问题:如果 Logrotate 无法访问日志文件,可能是权限设置不当。

通过上述步骤,您可以有效地手动触发和调试 Logrotate,确保日志轮转配置的正确性和有效性。


5. ✅ 最佳实践与常见问题

最佳实践

  • 合理配置日志轮转策略:根据日志文件的生成速度和重要性,合理设置轮转周期和保留数量
  • 使用压缩功能:对旧日志进行压缩,节省磁盘空间
  • 定期检查日志文件状态:定期检查 /var/lib/logrotate/status 文件,了解日志轮转的状态和历史记录
  • 测试配置文件:在正式应用前,使用 -d 参数测试配置文件,确保配置正确无误

常见问题

  • 日志文件未轮转:检查配置文件中的轮转条件是否满足,例如文件大小、轮转周期等
  • 日志文件丢失:确保配置文件中使用了 create 指令,创建新日志文件时设置了正确的权限和所有者
  • 服务未重载:检查 postrotate 脚本是否正确执行,服务是否支持相应的重载信号
http://www.xdnf.cn/news/7438.html

相关文章:

  • 开发体育比分网站,有哪些坑需要注意的
  • 手搓一个Transformer
  • 以用户为中心的产品才是好产品
  • Kali安装配置JAVA环境和切换JDK版本的最详细的过程
  • BGP综合实验(2)
  • ai agent(智能体)开发 python高级应用7: crawl4ai 0.6.3 加re正则表达式 获取百度中含有 韩立的图片要求横屏图片
  • ts导入vue文件时提示找不到模块或其相应的类型声明问题解决
  • ADVANTEST Q8326光学波长计操作手Operation Manual
  • 升级mysql (rpm安装)
  • MIMO 检测(6)--最大似然检测(1)
  • js逆向反调试的基本 bypass
  • 【C语言】大程序结构
  • Linux详解基本指令(一)
  • 对盒模型的理解
  • 澳大利亚TikTok网络专线+本地化策略:澳洲电商品牌的破局之道
  • 最大子树和--树形dp
  • day30python打卡
  • Rust 学习笔记:关于错误处理的练习题
  • 1-3V升3.2V升压驱动WT7013
  • 反射操作注解的详细说明
  • HTTPS核心机制拆解
  • Windows 如何安装CUDA
  • 【免杀】C2免杀技术(六)进程镂空(傀儡进程)
  • 往现有虚拟环境中增加python3.9.6
  • 万用表如何区分零线、火线、地线
  • 2022年下半年信息系统项目管理师——综合知识真题及答案(3)
  • Pytorch---view()函数
  • 机器人编程基础---C语言中的文件操作
  • SHELL练习题(1-11题)记录(牛客)
  • 力扣HOT100之二叉树:199. 二叉树的右视图