模块-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)
posted @ 2018-03-31 00:51  丫丫625202  阅读(175)  评论(0编辑  收藏  举报