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

        def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None): 

            BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay) 

            self.when = when.upper() 

            self.backupCount = backupCount 

            self.utc = utc 

            self.atTime = atTime 

            # 日期设置,支持多种方式 

            if self.when == 'S'

                self.interval = 1 # one second 

                self.suffix = "%Y-%m-%d_%H-%M-%S" 

                self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$" 

            ... 

     

            self.extMatch = re.compile(self.extMatch, re.ASCII) 

            self.interval = self.interval * interval # multiply by units requested 

            filename = self.baseFilename 

            if os.path.exists(filename): 

                t = os.stat(filename)[ST_MTIME]  # 最后修正时间 

            else

                t = int(time.time()) 

            self.rolloverAt = self.computeRollover(t)  # 提早计算终止时间 

     

        def computeRollover(self, currentTime): 

            # 判别的办法还是很长很复杂的,先pass 

     

        def shouldRollover(self, record): 

            t = int(time.time()) 

            if t >= self.rolloverAt:  # 判别能否到期 

                return 1 

            return 0 

     

        def doRollover(self): 

            ... 

            dfn = self.rotation_filename(self.baseFilename + "." + 

                                         time.strftime(self.suffix, timeTuple)) 

            #  滚动日志文件 

            if os.path.exists(dfn): 

                os.remove(dfn) 

            self.rotate(self.baseFilename, dfn) 

            if self.backupCount > 0

                for s in self.getFilesToDelete(): 

                    os.remove(s) 

            ... 

            # 计算下一个时间点 

            newRolloverAt = self.computeRollover(currentTime) 

            ... 

            self.rolloverAt = newRolloverAt 

    日期滚动就是计算最后时间点,超过时间点则重重生成新的日志文件。

    小结

    logging的处置逻辑大约是这样的:

    创立Logger对象,提供API,用来接纳运用顺序日志

    Logger对象包括多个Handler

    每个Handler有一个Formatter对象

    每条日志都会生成一个LogRecord对象

    运用不同的Handler对象将LogRecored对象提交到不同的流

    每个日志对象经过Formatter格式化输入

    可以运用按日期/文件大小的方式停止日志文件的滚动记载

    小技巧

    掩盖对象的 __reduce__ 办法,让对象支持 reduce 函数:

    class RootLogger(Logger): 

        def __init__(self, level): 

            Logger.__init__(self, "root", level) 

     

        def __reduce__(self): 

            return getLogger, () 

    线程锁的创立和释放:

    _lock = threading.RLock() 

     

    def _acquireLock(): 

        if _lock: 

            _lock.acquire() 

     

    def _releaseLock(): 

        if _lock: 

            _lock.release() 

    线程锁的运用:

    def addHandler(self, hdlr): 

        _acquireLock() 

        try

            self.handlers.append(hdlr) 

        finally

            _releaseLock() 

     

    def removeHandler(self, hdlr): 

        _acquireLock() 

        try

            self.handlers.remove(hdlr) 

        finally

            _releaseLock() 

    参考链接

    Logging in Python https://realpython.com/python-logging/

    日志操作手册 https://docs.python.org/zh-cn/3.8/howto/logging-cookbook.html#cookbook-rotator-namer

    Python 的日志记载工具 https://docs.python.org/zh-cn/3.8/library/logging.html

    【编辑引荐】

    Excel用户的福音:不用写代码就能开发一个带界面的顺序

    就凭这3点,可以完全了解Python的类办法与静态办法

    学完编程基础语法之后应该做些什么

    python深度学习:为什么要学习深度学习?

    鸿蒙的JS开发部形式18:鸿蒙的文件上传到Python效劳器端

    (责任编辑:admin)