Добавьте Slack webhook для автоматической отправки журналов ошибок из Flask или Python - PullRequest
1 голос
/ 15 апреля 2020

Я уже посмотрел на следующие решения ссылка

Я хочу автоматически отправлять все ошибки, настроенные через logging.error(), чтобы ослабить, используя обработчик. Как это сделать.

1 Ответ

2 голосов
/ 15 апреля 2020

Вы можете использовать пользовательский обработчик HTTP, так как класс обработчика HTTP по умолчанию не позволяет отправлять приложение / json в полезной нагрузке запроса.

Вы можете прочитать о обработчиках HTTP здесь

Ниже приведен пример в Flask. Вы можете сделать то же самое в Python.

Я использовал Python3.7 в примере с Flask==1.1.1

Пример

Сохранить этот файл как test.py

import json
import requests
import logging

from logging.config import dictConfig

from flask import Flask, make_response

class HTTPSlackHandler(logging.Handler):
    def emit(self, record):
        log_entry = self.format(record)
        json_text = json.dumps({"text": log_entry})
        # add your slack webhook, create it in slack apps
        url = "https://hooks.slack.com/services/<application_key>/<api_key>"
        return requests.post(url, json_text, headers={"Content-type": "application/json"}).content

dictConfig({
    "version": 1,
    "formatters": {"default": {
        "format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s",
    }},
    "handlers": {
        "wsgi": {
            "class": "logging.StreamHandler",
            "stream": "ext://flask.logging.wsgi_errors_stream",
            "formatter": "default"
        },
        "slack": {
            # add <filename> instead of test
            "class": "test.HTTPSlackHandler",
            "formatter": "default",
            "level": "ERROR"
        }
    },
    "root": {
        "level": "DEBUG",
        "handlers": ["wsgi", "slack"]
    }
})

app = Flask(__name__)

@app.route("/test", methods=["GET"])
def health_check():
    try:
        x = 1/0
    except:
        logging.error('This will be notified on slack')

    return make_response("OK", 200)

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

Тестирование

curl localhost:5000/test

...