您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    Python 如何仅用 5000 行代码,完成弱小的 logging 模块?(5)
    时间:2021-03-08 21:02 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

                     msg, args, exc_info, func=None, sinfo=None, **kwargs): 

            ct = time.time() 

            self.name = name  # logger称号 

            self.msg = msg  # 日志标识信息 

            ... 

            self.args = args  # 变量 

            self.levelname = getLevelName(level) 

            ... 

         

        def getMessage(self): 

            msg = str(self.msg) 

            if self.args: 

                msg = msg % self.args  # 格式化音讯 

            return msg 

    处置器对象 Hander

    顶级Handler定义了Handler的模版办法

    class Handler(Filterer):  # 处置器也可以过滤日志 

        def __init__(self, level=NOTSET): 

            Filterer.__init__(self) 

            self._name = None 

            self.level = _checkLevel(level)  # handler也有日志级别 

            self.formatter = None 

            _addHandlerRef(self) 

            self.createLock() 

             

        def handle(self, record):  # 处置日志 

            rv = self.filter(record)  # 过滤日志 

            if rv: 

                self.acquire()  # 央求锁 

                try

                    self.emit(record)  # 提交记载,由不同子类完成  

                finally

                    self.release()  # 释放锁 

            return rv 

    默许的console流 StreamHandler

    class StreamHandler(Handler): 

     

        terminator = '\n'  # 自动换行 

     

        def __init__(self, stream=None): 

            Handler.__init__(self) 

            if stream is None: 

                stream = sys.stderr  # 默许运用stderr输入 

            self.stream = stream 

         

        def emit(self, record): 

            try

                msg = self.format(record)  # 格式化日志记载 

                stream = self.stream 

                stream.write(msg + self.terminator)  # 写日志 

                self.flush()  # 刷新写缓存 

            except Exception: 

                ... 

         

        def format(self, record): 

            if self.formatter: 

                fmt = self.formatter 

            else

                fmt = _defaultFormatter 

            return fmt.format(record)  # 运用格式化器格式化日志记载 

    为什么运用stderr,可以看下面的测试中的输入都是到console:

    print("haha"

    print("fatal error", file=sys.stderr) 

    sys.stderr.write("fatal error\n"

    格式器对象 Formatter

    格式化器主要运用Formatter和Style完成

    class Formatter(object): 

        def __init__(self, fmt=None, datefmt=None, style='%', validate=True): 

            self._style = _STYLES[style][0](fmt) 

            self._fmt = self._style._fmt 

            self.datefmt = datefmt 

         

        def format(self, record): 

            record.message = record.getMessage() 

            s = self.formatMessage(record) 

            return s 

             

        def formatMessage(self, record): 

            return self._style.format(record)  # 格式化 

    Style类

    class PercentStyle(object): 

     

        default_format = '%(message)s' 

        asctime_format = '%(asctime)s' 

        asctime_search = '%(asctime)' 

        validation_pattern = re.compile(r'%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]', re.I) 

     

        def __init__(self, fmt): 

            self._fmt = fmt or self.default_format 

     

        def usesTime(self): 

            return self._fmt.find(self.asctime_search) >= 0 

     

        def validate(self): 

    (责任编辑:admin)