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的了")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章