python 重写logging.Handler的emit 实现日志输出到 redis 数据库

python中想要把日志输出到redis,可以写一个类继承logging.Handler,并重写emit方法来实现

import logging
import datetime
from redis import StrictRedis, ConnectionPool
from core.settings import REDIS_HOST, REDIS_DB, REDIS_PORT

pool = ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB)
redis_conn = StrictRedis(connection_pool=pool)
website_abbr = "baidu"


class LoggerHandlerToRedis(logging.Handler):
    def __init__(self, *args, **kwargs):
        self.website_abbr = kwargs.get("website_abbr") or ""
        super(LoggerHandlerToRedis, self).__init__()

    def emit(self, record):
        """
        无论日志输出到数据库还是websocker输出到前端都可以在此实现
        :param record:
        :return:
        """
        redis_conn.rpush(self.website_abbr + settings.REDIS_KEY_PROVIDER_LOG, datetime.datetime.now().strftime(
            '%Y-%m-%d %H:%M:%S') + " : " + str(self.format(record)))
        redis_conn.expire(self.website_abbr + settings.REDIS_KEY_PROVIDER_LOG,
                          settings.REDIS_KEY_PROVIDER_LOG_EXPIRE_TIME)


log_handler_to_redis = LoggerHandlerToRedis(website_abbr=website_abbr)
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
logger.addHandler(log_handler_to_redis)
logger.info(f"从现在开始我就是输出到redis的了")
logger.removeHandler(log_handler_to_redis)
logger.info(f"从现在开始我就是不输出到redis的了")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章