写了个测试接口日志模块:
import logging class Log: def __init__(self,filename,level="INFO"): print ("start") self.filename=filename self.level=level self.logger=logging.getLogger() #得到logger实体 self.logger.setLevel(logging.DEBUG)#设置日志最低输出级别默认为WARN self.formatter=logging.Formatter("[%(asctime)s - %(filename)s] - %(levelname)s : %(message)s")#设置日志格式 def __createHandler(self): #创建FileHandler,日志输入到文件 fh=logging.FileHandler(self.filename,‘a‘) fh.setLevel(logging.DEBUG) fh.setFormatter(self.formatter) self.logger.addHandler(fh) # 创建FileHandler,日志输入到控制台 ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(self.formatter) self.logger.addHandler(ch) return fh,ch def __console(self,message): if self.level == "INFO": self.logger.info(message) if self.level == "DEBUG": self.logger.debug(message) if self.level == "WARN": self.logger.warn(message) if self.level == "ERROR": self.logger.error(message) def __call__(self,fuc): def wrapper(*args,**kwargs): fh, ch=self.__createHandler() for i in range(len(args)): self.__console(args[i]) self.logger.removeHandler(fh) self.logger.removeHandler(ch) fuc(*args, **kwargs) return wrapper #测试代码 filename="test.log" url="http://192.168.100.34:8325/business/metadata/city/get" way="GET" header="{‘Hyaline-Auth-AccessHeader‘: {‘sysCode‘:‘che001‘}" params="{‘code‘: u‘04986580‘}" @Log(filename,level="INFO") def writeLog(url,way,header,params): print ("其他操作") writeLog(url,way,header,params)
1.getLogger():这是最基本的入口,该方法参数可以为空,默认的logger名称是root,如果在同一个程序中一直都使用同名的logger,其实会拿到同一个实例,使用这个技巧就可以跨模块调用同样的logger来记录日志。
2.Formatter对象定义了log信息的结构和内容,构造时需要带两个参数:
- 一个是格式化的模板
fmt
,默认会包含最基本的level
和message
信息 - 一个是格式化的时间样式
datefmt
,默认为2003-07-08 16:49:45,896 (%Y-%m-%d %H:%M:%S)
fmt
中允许使用的变量可以参考下表。
- %(name)s Logger的名字
- %(levelno)s 数字形式的日志级别
- %(levelname)s 文本形式的日志级别
- %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
- %(filename)s 调用日志输出函数的模块的文件名
- %(module)s 调用日志输出函数的模块名|
- %(funcName)s 调用日志输出函数的函数名|
- %(lineno)d 调用日志输出函数的语句所在的代码行
- %(created)f 当前时间,用UNIX标准的表示时间的浮点数表示|
- %(relativeCreated)d 输出日志信息时的,自Logger创建以来的毫秒数|
- %(asctime)s 字符串形式的当前时间。默认格式是“2003-07-08 16:49:45,896”。逗号后面的是毫秒
- %(thread)d 线程ID。可能没有
- %(threadName)s 线程名。可能没有
- %(process)d 进程ID。可能没有
- %(message)s 用户输出的消息Logging有如下级别: DEBUG,INFO,WARNING,ERROR,CRITICAL
3.SetLevel默认级别是WARNING,logging模块只会输出指定level以上的log。这样的好处, 就是在项目开发时debug用的log,在产品release阶段不用一一注释,只需要调整logger的级别就可以了,很方便。
4.Handler最常用的是StreamHandler和FileHandler, Handler用于向不同的输出端打log。
Logging包含很多handler, 可能用到的有下面几种
- StreamHandler instances send error messages to streams (file-like objects).
- FileHandler instances send error messages to disk files.
- RotatingFileHandler instances send error messages to disk files, with support for maximum log file sizes and log file rotation.
- TimedRotatingFileHandler instances send error messages to disk files, rotating the log file at certain timed intervals.
- SocketHandler instances send error messages to TCP/IP sockets.
- DatagramHandler instances send error messages to UDP sockets.
- SMTPHandler instances send error messages to a designated email address.