gunicorn 自定義日誌

守望人间發表於2024-07-06

gunicorn 自定義日誌

預設情況下,如果只透過errorlogaccesslog引數指定 gunicorn 的日誌檔案,日誌檔案會一直增長,最後導致硬碟佔用過大和檢查日誌不方便。因此需要自定義配置滾動日誌儲存。

配置檔案

直接在 gunicorn 的配置檔案 gunicorn_conf.py 中新增logconfig_dict配置項

import multiprocessing

bind = '0.0.0.0:8000'
workers = multiprocessing.cpu_count() * 2 + 1
backlog = 2048
debug = False
timeout = 500
daemon = True
pidfile = './logs/gunicorn.pid'
logconfig_dict = {
    'version': 1,
    'disable_existing_loggers': False,
    'root': {'level': 'INFO', 'handlers': ['console']},
    'loggers': {
        'gunicorn.error': {
            'level': 'INFO',
            'handlers': ['error_file'],
            'propagate': False,
            'qualname': 'gunicorn.error'
        },
        'gunicorn.access': {
            'level': 'INFO',
            'handlers': ['access_file'],
            'propagate': False,
            'qualname': 'gunicorn.access'
        }
    },
    'handlers': {
        # 必須配置 console handler,root logger 預設使用 console handler
        # 或者在 root 中指定自定義的 handler
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'generic',
            'stream': 'ext://sys.stdout'
        },
        'error_file': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': './logs/gunicorn.error.log',
            'maxBytes': 5 * 1024 * 1024,
            'backupCount': 5,
            'formatter': 'generic'
        },
        'access_file': {
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': './logs/gunicorn.access.log',
            'maxBytes': 5 * 1024 * 1024,
            'backupCount': 5,
            'formatter': 'generic'
        },
    },
    'formatters': {
        'generic': {
            'format': '%(asctime)s [%(process)d] [%(levelname)s] %(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S %z',
            'class': 'logging.Formatter'
        }
    }
}

問題

將 19 版本的配置直接複製到 22 版的 gunicorn 中使用時,出現Error: Unable to configure root logger報錯。
透過對比 gunicorn 的CONFIG_DEFAULTS配置,發現在老版本中不需要考慮 root logger 的問題,在新版本中,gunicorn 會有一個預設的 root logger,並且使用的 handler 是 console,如果在 handlers 中沒有配置就會導致報錯。
解決方法:

  1. 在 handler 中配置 console handler
  2. 增加配置 root logger 配置項,並指定已有的 handler

相關文章