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()