logging模块封装和使用

logging模块封装

背景和目标

自带的logging已经挺好用了,但是默认参数满足不了我们实际业务的需求
Eg:打印的格式、记录的分片、区分环境等等
封装一个通用的支持自定义的日志记录模块,默认支持控制台输出、支持文件输出、支持按时间分片

开工前要知道的几个logging的几个类
Logger  记录器 分发传输日志
Format  格式化的类
Handler 处理器
... 
image
使用
基本使用方法
l = Log()
l.d('debug')
l.i('info')
l.w('warn')
l.e('error')
带参数的方法
l = Log(debugMode=True,showInScreen=False)
l.d('debug')
l.i('info')
l.w('warn')
l.e('error')
# debugMode 控制输出等级为debug之上的日志
# showInScreen 控制是否展示在屏幕上,只输出文件
高级用法

自定义LogLoader对象,指定你自己的handler对象formater对象等

        class MLogLoader(LogLoader):

            def __init__(self):
                self.handler = handlers.RotatingFileHandler(filename='logs/log', maxBytes=1024, backupCount=10000)
                self.formater = Formatter('%(message)s')

        l = Log(debugMode=True, logLoader=MLogLoader(), showInScreen=True)
原理
Log类

Log
1.提供日志答应方法
2.接受参数,接受LogRecord对象
3.解析默认的LogRecord对象,实现TimedRotatingFileHandler和默认的格式化方式

class Log:

    def __init__(self,logLoader=LogLoader(),debugMode=False,showInScreen = True):
        self.logger = logging.getLogger()
        if debugMode:
            self.logger.setLevel(logging.DEBUG)
        else:
            self.logger.setLevel(logging.WARNING)
        h = logLoader.handler
        h.setFormatter(logLoader.formater)

        self.logger.addHandler(h)

        if showInScreen:
            s = logging.StreamHandler()
            s.setFormatter(logLoader.formater)
            self.logger.addHandler(s)

LogLoader类

提供默认的格式化方法和处理器,实现的是TimedRotatingFileHandler

class LogLoader:

    def __init__(self,handler=None,formater=None):
        if not handler:
            self.handler = self._getDefaultHandler()
        else:
            self.handler = handler
        if not formater:
            self.formater = self._getDefaultFromater()
        else:
            self.formater = formater

    def _getDefaultHandler(self):
        if not os.path.exists('logs'):
            os.mkdir('logs')
        t_handler = handlers.TimedRotatingFileHandler(filename='logs/log',when='M')
        t_handler.suffix = '%Y%m%d_%H-%M.log'
        return t_handler

    def _getDefaultFromater(self):
        t_format = logging.Formatter(
            '%(asctime)s %(levelname).1s %(message)s',
            '%Y-%m-%d %H:%M:%S')
        return t_format
单元测试程序
import unittest
import time
from third.logger_new.Log import Log, LogLoader
from logging import Formatter, handlers

class MyTestCase(unittest.TestCase):

    def makeLog(self,l=None):
        for i in range(20000):
            l.d(str(time.time_ns()))
            time.sleep(0.2)

    def test_easyuse(self):
        l = Log(debugMode=True)
        self.makeLog(l=l)

    def test_easyuse2(self):
        l = Log(debugMode=True,showInScreen=False)
        self.makeLog(l=l)

    def test_customLoader(self):
        f_handler = handlers.RotatingFileHandler(filename='logs/log', maxBytes=1024, backupCount=10000)
        mHandler = LogLoader(handler=f_handler)
        l = Log(debugMode=True,logLoader=mHandler)
        self.makeLog(l=l)

    def test_customLoader(self):
        class MLogLoader(LogLoader):

            def __init__(self):
                self.handler = handlers.RotatingFileHandler(filename='logs/log', maxBytes=1024, backupCount=10000)
                self.formater = Formatter('%(message)s')

        l = Log(debugMode=True, logLoader=MLogLoader(), showInScreen=True)
        self.makeLog(l=l)

if __name__ == '__main__':
    unittest.main()

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容