import logging import os from logging import handlers class JsonFilter(logging. Filter ): # 此处定义字段的默认值,如果打印信息时不设置对应字段,则为默认值 # 服务服务名或者服务主机 server = "" # 访问ip ip = "" # 访问资源路径 sourceurl = "" # 访问方式 method = "" # 访问设备 devices = "" # 访问协议 Protocols = "" # 访问结果的HTTP状态码 result_Httpstatus = "" # 访问结果的状态码 result_status = "" # 访问结果的msg信息 result_msg = "" # 访问结果的数据大小 result_msgsize = "" def filter ( 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 return True class CommonLog( object ): """ 日志记录 """ def __init__( self , logger, logname = 'Access_log' ): self .logname = os.path.join( "D:\python protest\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 " ) def console( 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) if level = = 'info' : self .logger.info(message) elif level = = 'debug' : self .logger.debug(message) elif level = = 'warning' : self .logger.warning(message) elif level = = 'error' : self .logger.error(message) # 这两行代码是为了避免日志输出重复问题 self .logger.removeHandler(ch) self .logger.removeHandler(fh) # 关闭打开的文件 fh.close() def debug( self , message): self .console( 'debug' , message) def info( self , message): self .console( 'info' , message) def warning( self , message): self .console( 'warning' , message) def error( 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("") |