You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何指定Gunicorn日志文件最大大小,达到后自动覆盖

解决Gunicorn日志文件持续增大的问题

好问题!Gunicorn本身并没有直接内置按大小自动轮转/覆盖日志的功能,但我们可以通过两种成熟的方案来解决这个问题:

方案一:使用系统自带的logrotate工具(推荐,无需修改代码)

Linux系统几乎都预装了logrotate,它是专门用来管理日志文件的工具,可以按大小、时间等规则自动切割、归档日志。

步骤:

  1. 创建Gunicorn的logrotate配置文件
    /etc/logrotate.d/目录下新建一个文件(比如gunicorn),内容如下:

    /绝对路径/到你的/gunicorn.log {
        size 10M          # 日志达到10MB时触发轮转
        rotate 5          # 保留最多5个归档日志文件
        copytruncate      # 复制当前日志内容到归档文件后,清空原日志(避免Gunicorn因文件句柄失效报错)
        missingok         # 如果日志文件不存在,不报错
        notifempty        # 如果日志文件为空,不执行轮转
        compress          # 可选:归档文件自动压缩(节省空间)
    }
    

    注意把路径替换成你实际的gunicorn.log路径。

  2. 测试配置是否生效
    手动执行一次轮转命令验证:

    logrotate -f /etc/logrotate.d/gunicorn
    

    执行后你会看到生成类似gunicorn.log.1的归档文件,原日志被清空。

  3. 自动执行
    系统默认会每天通过cron任务自动运行logrotate,无需额外操作,它会定期检查日志大小并执行轮转。

方案二:通过Python日志配置实现应用级轮转

如果你的应用是基于Python的(比如Flask/Django),可以直接在代码中配置RotatingFileHandler,让日志达到指定大小后自动切割。

示例(以Flask应用为例):

在你的myapp.py中添加日志配置:

import logging
from logging.handlers import RotatingFileHandler
from flask import Flask

app = Flask(__name__)

# 配置轮转日志处理器
log_handler = RotatingFileHandler(
    'gunicorn.log',
    maxBytes=10*1024*1024,  # 单日志文件最大10MB
    backupCount=5,           # 保留5个备份文件
    encoding='utf-8'
)
# 设置日志格式
log_formatter = logging.Formatter(
    '%(asctime)s | %(levelname)s | %(process)d | %(message)s'
)
log_handler.setFormatter(log_formatter)

# 将处理器绑定到Gunicorn的日志器
gunicorn_logger = logging.getLogger('gunicorn.error')
gunicorn_logger.addHandler(log_handler)
gunicorn_logger.setLevel(logging.INFO)

# 你的应用业务代码...

启动Gunicorn时,可以去掉--log-file参数,让它使用我们自定义的日志配置;如果保留该参数,Gunicorn会同时输出到文件和我们的轮转处理器,根据你的需求调整即可。

两种方案对比

  • logrotate:系统级工具,无需修改应用代码,适用于所有Gunicorn部署场景,维护成本低。
  • Python日志配置:应用级控制,更灵活(可自定义日志格式、过滤规则等),适合需要精细控制日志的场景。

内容的提问来源于stack exchange,提问作者abisko

火山引擎 最新活动