Python logging自定义字段输出及打印颜色
logging模块是Python的一个标准库模块,开发过程中,可以通过该模块,灵活的完成日志的记录。
logging模块提供了两种记录日志的方式:
1)使用logging提供的模块级别的函数(logging.basicConfig,logging.debug,logging.info...)
2)使用logging模块的组件(loggers,handlers,filters,formatters)
简单示例
importjson importlogging classJsonFilter(logging.Filter): #此处定义字段的默认值,如果打印信息时不设置对应字段,则为默认值 #服务服务名或者服务主机 server="" #访问ip ip="" #访问资源路径 sourceurl="" #访问方式 method="" #访问设备 devices="" #访问协议 Protocols="" #访问结果的HTTP状态码 result_Httpstatus="" #访问结果的状态码 result_status="" #访问结果的msg信息 result_msg="" #访问结果的数据大小 result_msgsize="" deffilter(self,record): record.server=self.server record.ip=self.ip record.sourceurl=self.sourceurl record.method=self.method record.devices=self.devices record.Protocols=self.Protocols record.result_Httpstatus=self.result_Httpstatus record.result_status=self.result_status record.result_msg=self.result_msg record.result_msgsize=self.result_msgsize returnTrue if__name__=='__main__': formate=json.dumps({ "time":"%(asctime)s", "levelname":"%(levelname)s", "server":"%(server)s", "ip":"%(ip)s", "sourceurl":"%(sourceurl)s", "method":"%(method)s", "devices":"%(devices)s", "Protocols":"%(Protocols)s", "result_Httpstatus":"%(result_Httpstatus)s", "result_status":"%(result_status)s", "result_msg":"%(result_msg)s", "result_msgsize":"%(result_msgsize)s", }) logging.basicConfig(level=logging.DEBUG,format=formate) logger=logging.getLogger() filter_=JsonFilter() logger.addFilter(filter_) filter_.server='127.0.0.1:8100' filter_.ip='127.0.0.1' filter_.sourceurl='http://127.0.0.1:8100/test' filter_.method='Get' filter_.devices='Chrome' filter_.Protocols='HTTP' filter_.result_Httpstatus='200' filter_.result_status='1001' filter_.result_msg='增加成功' filter_.result_msgsize='4296' logger.info("")#如果你需要在打印字段中设置
一个完整的例子
importlogging importos fromloggingimporthandlers classJsonFilter(logging.Filter): #此处定义字段的默认值,如果打印信息时不设置对应字段,则为默认值 #服务服务名或者服务主机 server="" #访问ip ip="" #访问资源路径 sourceurl="" #访问方式 method="" #访问设备 devices="" #访问协议 Protocols="" #访问结果的HTTP状态码 result_Httpstatus="" #访问结果的状态码 result_status="" #访问结果的msg信息 result_msg="" #访问结果的数据大小 result_msgsize="" deffilter(self,record): record.server=self.server record.ip=self.ip record.sourceurl=self.sourceurl record.method=self.method record.devices=self.devices record.Protocols=self.Protocols record.result_Httpstatus=self.result_Httpstatus record.result_status=self.result_status record.result_msg=self.result_msg record.result_msgsize=self.result_msgsize returnTrue classCommonLog(object): """ 日志记录 """ def__init__(self,logger,logname='Access_log'): self.logname=os.path.join("D:\pythonprotest\protest",'%s'%logname) self.logger=logger self.logger.setLevel(logging.INFO) self.logger.propagate=False self.filter_=JsonFilter() self.logger.addFilter(self.filter_) self.formatter=logging.Formatter("time:%(asctime)s-levelname:%(levelname)s-server:%(server)s-ip:%(ip)s-sourceurl:%(sourceurl)s-method:%(method)s-devices:%(devices)s-Protocols:%(Protocols)s-result_Httpstatus:%(result_Httpstatus)s-result_status:%(result_status)s-result_msg:%(result_msg)s-result_msgsize:%(result_msgsize)s") defconsole(self,level,message): #创建一个FileHandler,用于写到本地 fh=logging.handlers.TimedRotatingFileHandler(self.logname,when='MIDNIGHT',interval=1,encoding='utf-8') fh.suffix='%Y-%m-%d.log' fh.setLevel(logging.INFO) fh.setFormatter(self.formatter) self.logger.addHandler(fh) #创建一个StreamHandler,用于输出到控制台 ch=logging.StreamHandler() ch.setLevel(logging.INFO) ch.setFormatter(self.formatter) self.logger.addHandler(ch) iflevel=='info': self.logger.info(message) eliflevel=='debug': self.logger.debug(message) eliflevel=='warning': self.logger.warning(message) eliflevel=='error': self.logger.error(message) #这两行代码是为了避免日志输出重复问题 self.logger.removeHandler(ch) self.logger.removeHandler(fh) #关闭打开的文件 fh.close() defdebug(self,message): self.console('debug',message) definfo(self,message): self.console('info',message) defwarning(self,message): self.console('warning',message) deferror(self,message): self.console('error',message) if__name__=='__main__': logger=logging.getLogger() log=CommonLog(logger) log.filter_.server='127.0.0.1:8100' log.filter_.ip='127.0.0.1' log.filter_.sourceurl='http://127.0.0.1:8100/test' log.filter_.method='Get' log.filter_.devices='Chrome' log.filter_.Protocols='HTTP' log.filter_.result_Httpstatus='200' log.filter_.result_status='1001' log.filter_.result_msg='增加成功' log.filter_.result_msgsize='4296' log.info("")
设置日志打印颜色
#coding:utf-8 importlogging importos fromlogging.handlersimportRotatingFileHandler# importcolorlog#控制台日志输入颜色 log_colors_config={ 'DEBUG':'cyan', 'INFO':'green', 'WARNING':'yellow', 'ERROR':'red', 'CRITICAL':'red', } classLog: def__init__(self,logname='Access_log'): self.logname=os.path.join("D:\python_protest\protest",'%s'%logname) self.logger=logging.getLogger() self.logger.setLevel(logging.DEBUG) self.formatter=colorlog.ColoredFormatter( '%(log_color)s[%(asctime)s][%(filename)s:%(lineno)d][%(module)s:%(funcName)s][%(levelname)s]-%(message)s', log_colors=log_colors_config)#日志输出格式 defconsole(self,level,message): #创建一个FileHandler,用于写到本地 fh=logging.handlers.TimedRotatingFileHandler(self.logname,when='MIDNIGHT',interval=1,encoding='utf-8') fh.setLevel(logging.DEBUG) fh.setFormatter(self.formatter) self.logger.addHandler(fh) #创建一个StreamHandler,用于输出到控制台 ch=logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(self.formatter) self.logger.addHandler(ch) iflevel=='info': self.logger.info(message) eliflevel=='debug': self.logger.debug(message) eliflevel=='warning': self.logger.warning(message) eliflevel=='error': self.logger.error(message) #这两行代码是为了避免日志输出重复问题 self.logger.removeHandler(ch) self.logger.removeHandler(fh) fh.close()#关闭打开的文件 defdebug(self,message): self.console('debug',message) definfo(self,message): self.console('info',message) defwarning(self,message): self.console('warning',message) deferror(self,message): self.console('error',message) if__name__=="__main__": log=Log() log.info("测试1")#如果你需要在打印字段中设置 log.debug("测试2")#如果你需要在打印字段中设置
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。