在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


前言

应用和 Nginx 等会持续写日志,若不切割和清理,日志文件会占满磁盘,导致服务异常。logrotate 是 Linux 下常用的日志轮转工具,可按天或按大小切割、压缩旧日志、保留最近 N 份。本文只讲 logrotate 的核心配置思路和针对应用日志的示例,不贴完整可运行 Demo。

logrotate 基本用法

logrotate 通过配置文件定义「哪些日志、如何轮转、保留多少份」。配置一般在 /etc/logrotate.d/ 下,每个服务一个文件,主配置 /etc/logrotate.conf 会 include 该目录。

轮转由 cron 按天触发(如 /etc/cron.daily/logrotate),也可手动执行:sudo logrotate -f /etc/logrotate.conf-f 表示强制执行一次,用于测试)。

针对应用日志的配置示例

假设应用日志路径为 /var/www/app/logs/app.log,希望:每天轮转、保留 7 天、压缩旧日志、轮转后由应用继续写新文件(不丢日志)。

/var/www/app/logs/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0644 deploy deploy
    copytruncate
}

要点:

  • daily:按天轮转;也可用 size 50M 等按大小轮转。
  • rotate 7:保留 7 份轮转后的文件(如 app.log.1、app.log.2.gz 等),超过的删除。
  • compress:轮转后的文件用 gzip 压缩;delaycompress:最近一次轮转的文件不压缩(便于排查当天问题)。
  • missingok:日志文件不存在不报错;notifempty:空文件不轮转。
  • create 0644 deploy deploy:轮转后新建空日志文件,权限 0644,属主 deploy。若应用通过「重开文件句柄」写新文件,用 create 即可;若应用不重开句柄(只写 inode),需用 copytruncate:先拷贝当前文件再清空原文件,应用继续写原文件,可能丢失拷贝与清空之间的少量日志,但无需重启应用。
  • 二选一:要么 create(应用支持 SIGHUP 或重新打开日志路径),要么 copytruncate(应用不重开句柄时用)。

Nginx 日志示例

/var/log/nginx/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nginx adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
    endscript
}

sharedscripts:多文件只执行一次 postrotate。postrotate:轮转后发 USR1 让 Nginx 重新打开日志文件,避免写已轮转走的文件。若 Nginx 以 root 或 nginx 用户运行,需保证 create 的属主与 Nginx 一致。

Python 应用写日志的建议

应用侧建议按「日期或大小」切文件,便于与 logrotate 配合或替代 logrotate。例如使用 Python 的 logging.handlers.TimedRotatingFileHandler

from logging.handlers import TimedRotatingFileHandler

handler = TimedRotatingFileHandler(
    '/var/www/app/logs/app.log',
    when='midnight',
    interval=1,
    backupCount=7
)

这样应用自己按天切文件并保留 7 份,若不再用 logrotate 对该路径轮转,需注意磁盘总占用。若应用只写单一文件且不重开句柄,则用 logrotate 的 copytruncate 更省事,无需改应用代码。

总结

  • 使用 logrotate 的 daily(或 size)、rotatecompressdelaycompress 控制轮转与保留。
  • 应用能重开日志句柄时用 create;不能时用 copytruncate,接受极少量丢失。
  • Nginx 等需在 postrotate 中发信号让其重新打开日志。
  • 敏感日志路径与权限(create 的属主)需与运行用户一致,避免权限错误。

按上述方式配置即可避免日志占满磁盘,并保留近期日志便于排查问题。

Logo

加入「COC·上海城市开发者社区」,成就更好的自己!

更多推荐