Python3使用元类实现一个线程安全的logger

该博客介绍了如何使用Python的logging模块创建一个线程安全的单例日志类。日志类实现了将信息日志和错误日志分别写入不同的文件,并且使用TimedRotatingFileHandler按天进行日志轮转。同时,通过过滤器设置,使得信息日志只记录警告及以下级别,而错误日志记录错误及以上级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值