import threading
import logging # 引入logging模块
import logging.handlers
# 这个路径抽离到配置文件中去
info_log_path = "/tmp/service/info.log"
err_log_path = "/tmp/service/error.log"
class SingletonType(type):
"""线程安全的单例的元类,只要继承了metaclass=SingletonType,就是一个线程安全的单例类,可以抽离到公共文件中被引用"""
_instance_lock = threading.Lock()
def __call__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
with SingletonType._instance_lock:
if not hasattr(cls, "_instance"):
cls._instance = super(SingletonType, cls).__call__(*args, **kwargs)
return cls._instance
class SingleLogger(metaclass=SingletonType):
def __init__(self):
# 第一步,创建一个logger,这里默认是root
self.logger = logging.getLogger()
self.logger.setLevel(logging.INFO) # Log等级总开关
# 第二步,创建一个handler,用于写入日志文件
# fh = logging.FileHandler(info_log_path,mode="w")
info_fh = logging.handlers.TimedRotatingFileHandler(info_log_path, when="midnight")
# fh.setLevel(logging.DEBUG) # 输出到file的log等级的开关
# 设置日志过滤器
info_filter = logging.Filter()
info_filter.filter = lambda record: record.levelno <= logging.WARNING # 设置过滤等级
info_fh.setLevel(logging.INFO)
info_fh.addFilter(info_filter)
# fh = logging.FileHandler(info_log_path,mode="w")
err_fh = logging.handlers.TimedRotatingFileHandler(err_log_path, when="midnight")
err_filter = logging.Filter()
err_filter.filter = lambda record: record.levelno > logging.WARNING
err_fh.setLevel(logging.ERROR)
err_fh.addFilter(err_filter)
# 第三步,定义handler的输出格式
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
info_fh.setFormatter(formatter)
err_fh.setFormatter(formatter)
# 第四步,将logger添加到handler里面
self.logger.addHandler(info_fh)
self.logger.addHandler(err_fh)
logger = SingleLogger().logger
Python3使用元类实现一个线程安全的logger
最新推荐文章于 2025-07-11 09:51:38 发布