python中 logging的使用详解
日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分。
根据事件的轻重可分为以下几个级别:
DEBUG:详细信息,通常仅在诊断问题时才受到关注。整数level=10
INFO:确认程序按预期工作。整数level=20
WARNING:出现了异常,但是不影响正常工作.整数level=30
ERROR:由于某些原因,程序不能执行某些功能。整数level=40
CRITICAL:严重的错误,导致程序不能运行。整数level=50
默认的级别是WARNING,也就意味着只有级别大于等于的才会被看到,跟踪日志的方式可以是写入到文件中,也可以直接输出到控制台。
输出到控制台
下面是一个小例子通过将日志输出到控制台的方法:
importlogging logging.warning('Watchout!')#将输出到控制台 logging.info('Itoldyouso')#不会输出 logging.error("anerroroccurrence!")#将输出到控制台
输出结果
WARNING:root:Watchout! ERROR:root:anerroroccurrence
输出到文件中
新开一个python解释器,确保不是上面代码的session
importlogging logging.basicConfig(filename='example.log',level=logging.DEBUG) logging.debug('Thismessageshouldgotothelogfile') logging.info('Soshouldthis') logging.warning('Andthis,too')
这个时候控制台上面就没有了输出,文件example.log中的内容
DEBUG:root:Thismessageshouldgotothelogfile INFO:root:Soshouldthis WARNING:root:Andthis,too
假定需要手动调整日志的级别,我们可以在命令行以参数的形式传入--log=INFO,在代码中可以采用下面的处理方式
#输入参数--log=DEBUGor--log=debug numeric_level=getattr(logging,loglevel.upper(),None)#返回10,否则None ifnotisinstance(numeric_level,int): raiseValueError('Invalidloglevel:%s'%loglevel) logging.basicConfig(level=numeric_level,...)
变量的日志
使用格式化字符串的方式,为变量添加日志
importlogging logging.warning('%sbeforeyou%s','Look','leap!')
自定义日志格式
我们还可以根据我们的需求自定义输出模板
importlogging logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.DEBUG) logging.debug('Thismessageshouldappearontheconsole') logging.info('Soshouldthis') logging.warning('Andthis,too')
输出
2017-10-2414:03:53,671:DEBUG:Thismessageshouldappearontheconsole 2017-10-2414:03:53,690:INFO:Soshouldthis 2017-10-2414:03:53,694:WARNING:Andthis,too
内部实际传入的为一个字典,%(key)为字典的key。
上面是pythonlogging模块的一些基本用法,已经能够满足我们的许多需求,下面简单介绍下logging的一些高级用法。在logging模块中主要包括logger,handlers,filter,formatters,这几个组件
logger:提供了应用接口,供程序使用
handlers:用来将logger创建的log发送到相应的目的地
filter:为要输出的日志提供了更细粒度的设置
formatters:设置最终的输出格式
下面是这几个组件配合使用的例子
importlogging logger=logging.getLogger('logger_name')#创建logger对象 logger.setLevel(logging.DEBUG) handler=logging.StreamHandler()#创建consolehandler并设置级别为debug handler.setLevel(logging.DEBUG) formatter=logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')#创建输出格式 handler.setFormatter(formatter)#为handler添加fromatter logger.addHandler(handler)#将handler添加到logger logger.debug('debugmessage')#'application'code logger.info('infomessage') logger.warn('warnmessage') logger.error('errormessage') logger.critical('criticalmessage')
输出结果:
2017-10-2416:50:43,127-logger_name-DEBUG-debugmessage
2017-10-2416:50:43,138-logger_name-INFO-infomessage
2017-10-2416:50:43,141-logger_name-WARNING-warnmessage
2017-10-2416:50:43,144-logger_name-ERROR-errormessage
2017-10-2416:50:43,148-logger_name-CRITICAL-criticalmessage
小应用案例
下面是自己定义的一个日志处理方法,既能够写入到文件中(滚动保存近15天的日志,日志格式app.log,app.log.1,app.log.2),又能输出到控制台。
importlogging fromlogging.handlersimportTimedRotatingFileHandler classMylogHandler(logging.Logger): def__init__(self,name,level="DEBUG",stream=True,files=True): self.name=name self.level=level logging.Logger.__init__(self,self.name,level=self.level) ifstream: self.__streamHandler__(self.level) iffiles: self.__filesHandler__(self.level) def__streamHandler__(self,level=None): handler=TimedRotatingFileHandler(filename=self.name+".log",when='D',interval=1,backupCount=15) handler.suffix='%Y%m%d.log' handler.setLevel(level) formatter=logging.Formatter('%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s%(message)s') handler.setFormatter(formatter) self.addHandler(handler)#将hander添加到logger上 def__filesHandler__(self,level=None): handler=logging.StreamHandler() formatter=logging.Formatter('%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s%(message)s') handler.setFormatter(formatter) handler.setLevel(level) self.addHandler(handler) if__name__=='__main__': log=MylogHandler('test') log.info('thisisamyloghandler')
总结
以上所述是小编给大家介绍的python中logging的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!