Создать собственную функцию регистрации для модуля регистрации питонов - PullRequest
0 голосов
/ 24 октября 2019

Я некоторое время пытался выяснить, как создать пользовательскую функцию для модуля регистрации Python. Моя цель - с помощью обычной функции, такой как logging.debug(...), записывать в журнал сообщения по нескольким каналам, таким как Telegram или MQTT, для публикации. Поэтому моя идея состоит в том, чтобы добавить дополнительные аргументы к обычному методу журнала. Например logging.debug ("a log", telegram=True, mqtt=False) и, возможно, другие аргументы. Все, что я нахожу, это наследование класса logging.StreamingHandler и затем использование метода emit, но это только передает запись аргумента. Так как я могу реализовать свою проблему осмысленно? У меня ошибка мышления или неправильный подход?

1 Ответ

0 голосов
/ 28 октября 2019

Я решил свою проблему, создав интерфейс для модуля ведения журнала.

Небольшое представление о моем коде:

# ulogging.py
import logging
import telegram

def uloggingConfig(*args, **kwargs):
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)

    # general logging config section
    fmt = kwargs.pop("fmt", "%(asctime)s %(levelname)s %(message)s")
    datefmt = kwargs.pop("datefmt", "%m.%d.%Y %I:%M:%S %p")

    streamHandler = logging.StreamHandler()
    streamHandler.setLevel(logging.DEBUG)
    formater = logging.Formatter(fmt=fmt, datefmt=datefmt)
    streamHandler.setFormatter(formater)
    logger.addHandler(streamHandler)

    # telegram config section
    telegramBot = kwargs.pop("teleBot", None)
    telegramChatID = kwargs.pop("teleChatID", None)
    telegramLevel = kwargs.pop("teleLevel", logging.INFO)
    telegramFmt = kwargs.pop("telefmt", "%(message)s")
    telegramDatefmt = kwargs.pop("teledatefmt", None)

    if telegramBot is not None and telegramChatID is not None:
        telegramStream = TelegramStream(telegramBot, telegramChatID)
        formater = logging.Formatter(fmt=telegramFmt, datefmt=telegramDatefmt)
        telegramStream.setFormatter(formater)
        telegramStream.setLevel(telegramLevel)
        logger.addHandler(telegramStream)
    elif (telegramBot is not None and telegramChatID is None) or (telegramBot is None and telegramChatID is not None):
        raise KeyError("teleBot and teleChatID have to be both given")

    if kwargs:
        keys = ', '.join(kwargs.keys())
        raise ValueError('Unrecognised argument(s): %s' % keys)

    return logger

def getLogger():
    return logging.getLogger(__name__)

class TelegramStream(logging.StreamHandler):
    def __init__(self, telegramBot, telegramChatID):
        logging.StreamHandler.__init__(self)
        self._bot = telegramBot
        self._chatID = telegramChatID

    def emit(self, record):
        if record.levelname == "DEBUG":
            self._bot.send_message(self._chatID, record.levelname + ": " + record.msg)
        else:
            self._bot.send_message(self._chatID, record.msg)

С помощью метода uloggingConfig () я могу теперь передать все настройкидля разных обработчиков (на данный момент только для telegram, последующие обработчики должны следовать). Затем метод uloggingConfig () принимает конфигурацию и возвращает регистратор, с помощью которого сообщения журнала могут создаваться как обычно.

Простой пример:

logger = ulogging.uloggingConfig(fmt="format, datefmt="dateformat, teleBot=telegramBot, teleChatID=telegramChatID, teleLevel=logging.DEBUG)

logger.debug("A log message")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...