【问题标题】:Create custom logging function for pythons logging module为 pythons 日志模块创建自定义日志功能
【发布时间】:2019-10-24 15:36:57
【问题描述】:

我一直在尝试弄清楚如何为 python 日志记录模块创建自定义函数。我的目标是,使用诸如logging.debug(...) 之类的常用功能,通过多个渠道(例如 Telegram 或 MQTT)发布日志消息。所以我的想法是为普通的日志方法添加额外的参数。例如logging.debug ("a log", telegram=True, mqtt=False) 可能还有其他参数。我发现的只是类logging.StreamingHandler的继承,然后使用方法emit,但这只会传递参数记录。那么如何以有意义的方式实现我的问题呢?是我思维错误还是方法不对?

【问题讨论】:

  • 您应该继承 StreamHandler 来将消息推送到电报 (TelegramHandler) 和 mqtt,然后将多个处理程序注册到单个 Logger。例如,如果您想要一个记录到电报和 mqtt 的记录器,请将您的电报和 mqtt 处理程序注册到它。添加电报和 mqtt 功能的猴子补丁方法始终是一种选择,但只是最后的手段。

标签: python inheritance logging python-logging


【解决方案1】:

我通过为日志模块创建接口解决了我的问题。

我的代码的小视图:

# 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() 方法,我现在可以传递不同处理程序的所有设置(目前仅适用于电报,应遵循更多处理程序)。然后 uloggingConfig() 方法接管配置并返回一个记录器,使用该记录器可以像往常一样创建日志消息。

一个简单的例子:

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

logger.debug("A log message")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    相关资源
    最近更新 更多