模块-logging
python的logging模块提供标准的日志接口,可以通过它存储各种格式的日志。
日志级别优先顺序:logger优先handler。logger默认级别为warning,logger全局一般设置为DEBUG,否则handler上的DEBUG级别格式就无法输出
过滤顺便:logger->handler
logging日志级别分别为debug(),info(),warnging(),error(),critical()
- debug():调试程序
- info()普通记录
- warning()无错误,有潜在问题
- error()程序出错,可能导致数据出错
- critical()严重错误,影响服务
简单用法
例:
默认屏幕输出
import logging logging.warning('user [Wang] attempted wrong password more than 10 tims') logging.critical('Server is down') # WARNING:root:user [Wang] attempted wrong password more than 10 tims # CRITICAL:root:Server is down
写入文件
import logging logging.basicConfig(filename='example.log',level=logging.INFO) #level:只记录此级别或比此级别更高的日志 logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this,too')
自定义日志格式
指定时间:
import logging logging.basicConfig(filename='example.log',level=logging.INFO,format='%(asctime)s %(message)s',datefmt='%Y-%m-%d %I:%M:%S %p') #level:只记录此级别或比此级别更高的日志 logging.debug('This message should go to the log file') logging.info('So should this') logging.warning('And this,too')
日志格式占位符:
#%(levelno)s:数字形式的日志级别 #%(levelname)s:文本形式日志级别
#%(name)s:logger名字 #%(pathname)s:调用日志输出函数的模块的完整路径名,可能没有 #%(filename)s:调用日志输出函数的模块的文件名 #%(module)s:调用日志输出函数的模块名 #%(funcName)s:调用日志输出函数的函数名 #%(lineno)d:调用日志输出函数语句所在的代码行 #%(created)s:当前时间,用unix标准的表示时间的浮点数表示 #%(relativeCreated)d:输出日志信息是,自Logger创建以来的毫秒数 #%(asctime)s:字符串形式的当前时间,默认是”年-月-日 时:分:秒,毫秒“格式 #%(thread)d:线程ID,可能没有 #%(threadName)s:线程名,可能没有 #%(process)d:线程ID,可能没有 #%(message)s:用户输出消息
多个输出路径
logger:
提供应用程序可以直接使用的接口。Logger通常对应了程序的模块名
例:
#聊天工具模块 LOG=logging.getLogger("chat.gui") #核心模块 LOG=logging.getLogger('chat.kernel')
#绑定handler和filters
LOG.setLevel(level=logging.DEBUG)
LOG.addFilter(filter='')
LOG.removeFilter(filter='')
LOG.addHandler(hdlr='')
LOG.removeHandler(hdlr='')
handler:
将logger创建的日志记录发送到指定的目的地,如屏幕,文件,网络。Logger可以通过addHandler()添加多个handler。
handler上可以指定日志级别,格式,filter对象
例:
handler=logging.Handler()#创建handler handler.setLevel(level=logging.INFO)#指定级别 handler.setFormatter()#设置日志格式 handler.addFilter(filter='')#添加过滤 handler.removeFilter(filter='')#删除过滤
- logging.StreamHandler:类似sys.stdout或sys.stderr的任何文件对象输出信息
- logging.FileHandler:向日志文件输出信息,FileHandler自动打开文件
- logging.handlers.RotatingFileHandler:类似FileHandler,但可以管理文件大小,达到一定大小后会自动修改名称再重新创建日志文件。如chat.log修改为chat.log.1...chat.log.2
- logging.handlers.TimedRotatingFileHandler:间隔一段时间自动创建一个新的日志文件。
formatter
决定日志最总输出格式。可以和handler或logger组合
例:
fh=logging.FileHandler('access.log') formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s') fh.setFormatter(formatter)#将formatter绑定到handler上
例子:
import logging #生成logger对象 logger=logging.getLogger('web') logger.setLevel(logging.INFO) #生成handler对象 ch=logging.StreamHandler() ch.setLevel(logging.DEBUG)#对handler设置级别 fh=logging.FileHandler('web.log') fh.setLevel(logging.WARNING)#对handler设置级别 #把handler对象绑定到logger对象 logger.addHandler(ch) logger.addHandler(fh) #生成formatter对象 file_formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') console_formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(lineno)d %(message)s') #把formatter对象添加到handler对象 ch.setFormatter(console_formatter) fh.setFormatter(file_formatter) logger.debug('debug test log') logger.info('info test log') logger.error('error test log')
confole输出:
file输出:
filter
对用户输出的日志进行过滤
例:
import logging class IgnoreBackupLogFilter(logging.Filter): """忽略db backup的日志""" def filter(self, record):#固定写法 return "db backup" not in record.getMessage()#返回True记录,False不记录 #生成logger对象 logger=logging.getLogger('web') logger.setLevel(logging.DEBUG) #将filter对象添加到logger中 logger.addFilter(IgnoreBackupLogFilter()) #生成handler对象 ch=logging.StreamHandler() ch.setLevel(logging.DEBUG)#对handler设置级别 fh=logging.FileHandler('web.log') fh.setLevel(logging.WARNING)#对handler设置级别 #把handler对象绑定到logger对象 logger.addHandler(ch) logger.addHandler(fh) #生成formatter对象 file_formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') console_formatter=logging.Formatter('%(asctime)s %(name)s %(levelname)s %(lineno)d %(message)s') #把formatter对象添加到handler对象 ch.setFormatter(console_formatter) fh.setFormatter(file_formatter) logger.debug('db backup test') logger.debug('not test')
console输出:
日志截断
例:
import logging from logging import handlers logger=logging.getLogger() #按文件大小分割文件 handler_size=handlers.RotatingFileHandler('web.log', mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)#100字节大小,存3份 #按时间间隔分割文件 handler_time=handlers.TimedRotatingFileHandler('web.log', when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False) #when,指定时间间隔类型 # 'S' | 秒 # 'M' | 分 # 'H' | 时 # 'D' | 天 # 'W0'-'W6' | 周一至周日 # 'midnight' | 每天的凌晨 #handler_time=handlers.TimedRotatingFileHandler('web.log', when='D', interval=1, backupCount=10, encoding=None, delay=False, utc=False) #每1存一个文件,一共存10个 logger.addHandler(handler_size) logger.addHandler(handler_time)