Настройка ведения журнала для Gunicorn в приложении Flask с использованием dictConfig Python - PullRequest
1 голос
/ 16 апреля 2020

Я хочу отправить свои журналы ошибок через email или slack webhook, а также сохранить журнал доступа в file. И когда я пытаюсь запустить с Gunicorn в качестве сервера приложений, я не вижу никаких журналов в моем терминале. Как правильно настроить Flask ведение журнала приложений с помощью Gunicorn.

# This is the command I am using
gunicorn app:app -b 0.0.0.0:5000

1 Ответ

2 голосов
/ 16 апреля 2020
  1. Добавьте пользовательский HTTPHandler для отправки журналов на Slack, поскольку данные должны быть отправлены через application/json в post запросе
  2. Для email вы можете SMTPHandler
  3. Используйте gunicorn.error и gunicorn.access регистраторы для получения ошибок от Gunicorn
  4. Используйте root, если вы используете python регистраторы
  5. Используйте RotatingFileHandler для access ротация файла журнала
import json
import requests
import logging
from logging.config import dictConfig

from flask import Flask

# for sending error logs to slack
class HTTPSlackHandler(logging.Handler):
    def emit(self, record):
        log_entry = self.format(record)
        json_text = json.dumps({"text": log_entry})
        url = SLACK_WEBHOOK
        return requests.post(url, json_text, headers={"Content-type": "application/json"}).content


dictConfig({
    "version": 1,
    "disable_existing_loggers": True,
    "formatters": {
        "default": {
            "format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s",
        },
        "access": {
            "format": "%(message)s",
        }
    },
    "handlers": {
        "console": {
            "level": "INFO",
            "class": "logging.StreamHandler",
            "formatter": "default",
            "stream": "ext://sys.stdout",
        },
        "email": {
            "class": "logging.handlers.SMTPHandler",
            "formatter": "default",
            "level": "ERROR",
            "mailhost": ("smtp.example.com", 587),
            "fromaddr": "devops@example.com",
            "toaddrs": ["receiver@example.com", "receiver2@example.com"],
            "subject": "Error Logs",
            "credentials": ("username", "password"),
        },
        "slack": {
            "class": "app.HTTPSlackHandler",
            "formatter": "default",
            "level": "ERROR",
        },
        "error_file": {
            "class": "logging.handlers.RotatingFileHandler",
            "formatter": "default",
            "filename": "/var/log/gunicorn.error.log",
            "maxBytes": 10000,
            "backupCount": 10,
            "delay": "True",
        },
        "access_file": {
            "class": "logging.handlers.RotatingFileHandler",
            "formatter": "access",
            "filename": "/var/log/gunicorn.access.log",
            "maxBytes": 10000,
            "backupCount": 10,
            "delay": "True",
        }
    },
    "loggers": {
        "gunicorn.error": {
            "handlers": ["console"] if debug else ["console", "slack", "error_file"],
            "level": "INFO",
            "propagate": False,
        },
        "gunicorn.access": {
            "handlers": ["console"] if debug else ["console", "access_file"],
            "level": "INFO",
            "propagate": False,
        }
    },
    "root": {
        "level": "DEBUG" if debug else "INFO",
        "handlers": ["console"] if debug else ["console", "slack"],
    }
})

app = Flask(__name__)

if __name__ == "__main__":
    app.run(debug=debug, host="0.0.0.0", port="5000")

Это правильный способ запустить вышеуказанное приложение

# make sure to give --access-logfile and --error-logfile as '-' to make gunicorn send logs to stdout
gunicorn app:app -b 0.0.0.0:5000 --workers 2 -k gevent --timeout 300 --worker-connections 1000 --max-requests 1000000 --limit-request-line 8190 --access-logfile '-' --error-logfile '-'

Надеюсь, это поможет!

...