Python logging模块

基础知识

在学习Python的过程中,发现书籍对logging模块的介绍不是很多,而且也放在所有章节的最后几个部分。
确实日志模块对于开发小型程序或者个人开发时用处不是很大。但实际上在团队开发大型项目和大规模改造程序的内部构造时,日志是不可缺少的。它能记录相关信息并为之后出现的问题提供有效的帮助。

日志事件

按严重性从低到高,分别是DEBUG, INFO, WARNING, ERROR, CRITICAL。
默认的级别是WARNING,表示仅记录WARNING及以上的事件。
下图可以看出,严重性低于WARNING的INFO和DEBUG都没有被输出。

>>> import logging
>>> logging.info('1')
>>> logging.debug('2')
>>> logging.warning('3')
WARNING:root:3
>>> logging.error('4')
ERROR:root:4

另外,用于设置记录等级的logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR和logging.CRITICAL实际是Int类型。

import logging

>>> logging.DEBUG
10
>>> logging.INFO
20
>>> logging.WARNING
30
>>> logging.ERROR
40
>>> logging.CRITICAL
50
>>> type(logging.DEBUG)
<class 'int'>

所以不仅可以更改不同事件对应的严重等级,还可以在设置事件等级时,用对应的整数替代。

logging.basicConfig()

basicConfig()函数包含许多关键字参数,如filename, filemode, datefmt, leavel, format,style等。

filename:将事件记录到指定的文件中
filemode:默认为’a’,即以指定的模式打开filename文件
datefmt:指定日期和时间的格式
level:指定允许记录的最低严重性的事件。可以选择logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL。
format:使用指定的格式字符串作为处理器。
style:如果指定了 format,将为格式字符串使用此运算符,默认为%

一般来说,只要指定filename和level就可以完成大多工作,除非需要更细致的定制化设置。

logging.basicConfig(level=logging.INFO, filename='mylog.log')

要更改用于显示消息的格式,可以使用format关键字参数:

logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', level=logging.DEBUG)

asctimes指定日期时间格式,如果需要改变默认格式可以使用basicConfig()函数中的datefmt参数。允许的格式与time.strftime()支持的格式相同。

除了asctime, levelname, message,还有一些属性可以出现在format的格式字符串中:
filename:%(filename)s,显示文件名
lineno:%(lineno)d,显示此日志记录所在文件的行号
levelno: %(levelno)s,显示日志记录的严重性级别

可以在每个部分代码块前后加入日志记录,这样当出现不会导致程序终止,但是结果和预期不相符的异常时,详细的日记记录可能能发现问题所在。

日志模块的组件

记录器、处理器、过滤器和格式器

记录器暴露了应用程序代码直接使用的接口。

处理器将日志记录(由记录器创建)发送到适当的目标。

过滤器提供了更精细的附加功能,用于确定要输出的日志记录。

格式器指定最终输出中日志记录的样式。

记录器(Logger对象):

通过调用 Logger 类的实例来执行日志记录。

命名记录器时使用的一个好习惯是在每个使用日志记录的模块中使用模块级记录器:

logger = logging.getLogger(__name__)

最常见的配置方法:
Logger.setLevel() 指定记录器将处理的最低严重性日志消息
Logger.addHandler() 和 Logger.removeHandler() 从记录器对象中添加和删除处理器对象

创建日志消息:
Logger.debug(msg, *args, **kwargs) 或者Logger.info() 、 Logger.warning() 、 Logger.error() 和 Logger.critical()

记录器的两个特点:

  1. 如果记录器没有设置级别,则使用其父记录器的级别作为其有效级别。
  2. 子记录器将消息传播到与其父级记录器关联的处理器。(可以通过propagate 属性设置为 False 来关闭传播)

处理器(Handler对象)

Handler 对象负责将适当的日志消息(基于日志消息的严重性)分派给处理器的指定目标。
常见的处理器:

  1. StreamHandler 实例发送消息到流(类似直接打印消息)
  2. FileHandler 实例将消息发送到文件(basicConfig()函数指定了filename参数,相当于指定了一个FileHandler处理器)

其他还有发送到电子邮件的SMTPHandler,以GET或POST方法发送到HTTP服务器的HTTPHandler,对错误消息不执行任何操作的NullHandler ,有回滚功能的RotatingFileHandler 和TimedRotatingFileHandler

配置方法:
setLevel() :指定将处理的最低严重性日志消息
setFormatter() :指定一个格式器

格式器(Formatter对象)

格式器对象配置日志消息的最终顺序、结构和内容。 构造函数有三个可选参数 —— 消息格式字符串、日期格式字符串和样式指示符。

logging.Formatter.__init__(fmt=None, datefmt=None, style='%')

日志设置方法

Python 代码显式创建记录器、处理器和格式器

import logging

#先创建一个记录器并设置记录等级
logger = logging.getLogger('logger_example')
logger.setLevel(logging.INFO)

#创建一个处理器并设置处理等级
hd = logging.StreamHandler()
hd.setLevel(logging.INFO)

#最后创建一个格式器
formatter = logging.Formatter('%(asctime)s %(levelname)s:%(message)s')

#将格式器加入处理器中
hd.setFormatter(formatter)
#将处理器加入记录器中
logger.addHandler(hd)

这样就设置好了一个日志记录。

也可以创建日志配置文件并使用 fileConfig() 函数读取,或者创建配置信息字典并将其传递给 dictConfig() 函数。这个相对更高级,而且配置和代码的分离以及非开发者轻松修改日志记录属性的能力。显式创建的处理方法能基本满足日常使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值