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的了")