时间:2021-05-22
本文实例讲述了python日志logging模块使用方法。分享给大家供大家参考,具体如下:
一、从一个使用场景开始
开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件
import logging# 创建一个loggerlogger = logging.getLogger('mylogger')logger.setLevel(logging.DEBUG)# 创建一个handler,用于写入日志文件fh = logging.FileHandler('test.log')fh.setLevel(logging.DEBUG)# 再创建一个handler,用于输出到控制台ch = logging.StreamHandler()ch.setLevel(logging.DEBUG)# 定义handler的输出格式formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setFormatter(formatter)ch.setFormatter(formatter)# 给logger添加handlerlogger.addHandler(fh)logger.addHandler(ch)# 记录一条日志logger.info('foorbar')运行后, 在控制台和日志文件都有一条日志:
2011-08-31 19:18:29,816 - mylogger - INFO - foorbar
二、logging模块的API
结合上面的例子,我们说下几个最常使用的API
logging.getLogger([name])返回一个logger实例,如果没有指定name,返回root logger。只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例
Logger.setLevel(lvl)设置logger的level, level有以下几个级别:
NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出
logger.debug("foobar") # 不输出logger.info("foobar") # 输出logger.warning("foobar") # 输出logger.error("foobar") # 输出logger.critical("foobar") # 输出Logger.addHandler(hdlr)logger可以雇佣handler来帮它处理日志, handler主要有以下几种:StreamHandler : 输出到控制台FileHandler : 输出到文件handler还可以设置自己的level以及输出格式。
logging.basicConfig([**kwargs])这个函数用来配置root logger, 可以看它的源码,还是挺简单的。它首先检查root是否有handler,如果没有,那这个函数会创建一个StreamHandler,并设置默认的formatter。
然后将该handler添加到root。如果调用logging.basicConfig([**kwargs])的时候发现root logger已经有了handler,那该函数没有任何操作。
三、关于root logger以及logger的父子关系
前面多次提到root logger, 实际上logger实例之间还有父子关系, root logger就是处于最顶层的logger, 它是所有logger的祖先。如下图:
root logger是默认的logger,如果不创建logger实例, 直接调用logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()这些函数,那么使用的logger就是 root logger, 它可以自动创建,也是单实例的。
如何得到root logger通过logging.getLogger()或者logging.getLogger("")得到root logger实例。
默认的level:root logger默认的level是logging.WARNING
如何表示父子关系logger的name的命名方式可以表示logger之间的父子关系. 比如:parent_logger = logging.getLogger('foo')child_logger = logging.getLogger('foo.bar')
什么是effective levellogger有一个概念,叫effective level。 如果一个logger没有显示地设置level,那么它就用父亲的level。如果父亲也没有显示地设置level, 就用父亲的父亲的level,以此推....最后到达root logger,一定设置过level。默认为logging.WARNINGchild loggers得到消息后,既把消息分发给它的handler处理,也会传递给所有祖先logger处理,
来看一个例子
import logging# 设置root loggerr = logging.getLogger()ch = logging.StreamHandler()ch.setLevel(logging.DEBUG)formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')ch.setFormatter(formatter)r.addHandler(ch)# 创建一个logger作为父亲p = logging.getLogger('foo')p.setLevel(logging.DEBUG)ch = logging.StreamHandler()ch.setLevel(logging.DEBUG)formatter = logging.Formatter('%(asctime)s - %(message)s')ch.setFormatter(formatter)p.addHandler(ch)# 创建一个孩子loggerc = logging.getLogger('foo.bar')c.debug('foo')输出如下:
2011-08-31 21:04:29,893 - foo
2011-08-31 21:04:29,893 - DEBUG - foo
可见, 孩子logger没有任何handler,所以对消息不做处理。但是它把消息转发给了它的父亲以及root logger。最后输出两条日志。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python日志操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
用途logging模块是Python的内置模块,主要用于输出运行日志,可以灵活配置输出日志的各项信息。基本使用方法logging.basicConfig(lev
logging日志模块:是用来记录日志的模块,一般记录用户在软件中的操作 使用方法:模板直接拿来用,手动修改#logging的配置信息(模板)import
python的logging模块python提供了一个日志处理的模块,那就是logging。导入logging模块使用以下命令:importlogginglog
详解使用python的logging模块在stdout输出前言: 使用python的logging模块时,除了想将日志记录在文件中外,还希望在前台执行pyth
python自带了日志模块logging,可以用来记录程序运行过程中的日志信息。同时python还有logbook模块用来取代logging模块,在很多的项目中