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