作者:Gakki
1. 关于python中的日志模块。
1.1 日志等级
日志等级(level) | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型应用场景是问题诊断 |
INFO | 信息详细程序仅次于DEBUG,通常只记录关键节点信息, |
用于确认一切都是按照我们预期的那样进行工作 | |
WARNING | 当某些不期望的事件发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
- 日志等级:DEBUG<INFO<WARNING<ERROR<CRITICAL;等级从上到下依次升高,而日志信息依次减少。
1.2 日志字段信息与日志格式
- 输出一条日志时,日志内容和日志级别是需要开发人员明确指定的。对于而其它字段信息,只需要是否显示在日志中就可以了。
- 一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:
- 事件发生时间
- 事件发生位置
- 事件的严重程序–日志级别
- 事件内容等其他内容
1.3 logging模块的使用方式
- 两种记录日志的方式(logging提供的模块是对logging日志系统相关的封装):
- 使用logging提供的模块级别函数
- 使用logging日志系统的四大组件
1.3.1 logging模块定义的模块级别常用函数
函数 | 描述 |
---|---|
logging.debug(msg, *args, **kwargs) | 创建一条严重级别为DEBUG的日志记录 |
logging.info(msg, *args, **kwargs) | 创建一条严重级别INFO的日志记录 |
logging.warning(msg, *args, **kwargs) | 创建一条严重级别为WARNING的日志记录 |
logging.error(msg, *args, **kwargs) | 创建一条严重级别为ERROR的日志记录 |
logging.critical(msg, *args, **kwargs) | 创建一条严重级别为CRITICAL的日志记录 |
logging.log(level, *args, **kwargs) | 创建一条严重级别为level的日志记录 |
logging.basicConfig(**kwargs) | 对root logger进行一次性配置 |
- 其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、 “日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
1.3.2 logging日志模块的四大组件
组件名称 | 类名 | 描述 |
---|---|---|
日志器 | loggers | 提供应用程序代码直接使用的接口 |
处理器 | handlers | 用于将日志记录发送到指定的目的位置 |
过滤器 | filters | 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其他的日志记录将会被忽略) |
格式器 | formatters | 用于控制日志信息的最终输出格式 |
1.4 logging.basicConfig()函数说明
- 用于为logging日志系统做一些基本配置,方法定义:logging.basicConfig(**kwargs)
- 支持以下关键字:
格式 | 描述 |
---|---|
filename | 使用指定的文件名而不是StreamHandler创建FileHandler。设置之后日志信息将不会被输出到控制台 |
filemode | 如果指定了 filename,则用此模式打开该文件。 默认模式为’a’。 |
format | 处理器使用的指定格式字符串。即日志输出时所包含的字段以及它们的顺序。 |
datefmt | 使用指定的日期/时间格式,要在format中包含时间字段(%asctime)s时才有效。与 time.strftime() 所接受的格式相同。 |
style | 如果指定了 format,将为格式字符串使用此风格。 ‘%’, ‘{‘ 或 ‘$’ 分别对应于 printf 风格, str.format() 或 string.Template。 默认为 ‘%’。 |
level | 设置根记录器级别去指定 level。 |
stream | 使用指定的流初始化StreamHandler。请注意此参数与 filename是不兼容的,如果两者同时存在,则会引发ValueError。 |
handlers | 如果指定,这应为一个包含要加入根日志记录器的已创建处理程序的可迭代对象。 任何尚未设置格式描述符的处理程序将被设置为在此函数中创建的默认格式描述符。请注意此参数与 filename 或 stream 不兼容 —— 如果两者同时存在,则会引发 ValueError。 |
force | 如果将此关键字参数指定为 true,则在执行其他参数指定的配置之前,将移除并关闭附加到根记录器的所有现有处理器。 |
- logger是入口,然后通过handler来处理,handler还可以通过filter和formatter来对输出的日志过滤和格式化等操作。
1.5 logging模块定义的格式字符串字段。
logging模块定义的格式字符串字段.png1.6 logging日志模块相关的类及其常用方法介绍。
1.6.1logger类
- logger对象做的事情:
- 向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息。
- 基于日志严重等级或filter对象来决定要对哪些日志进行后续处理。
- 将日志消息传送给所有感兴趣的日志handlers。
- logger对象最常用的方法分为两类:
- 配置方法
- 消息发送方法
- logger最常用的配置方法:
方法 | 描述 |
---|---|
Logger.setLevel() | 设置日志器将会处理的日志消息的最低严重级别 |
Logger.addHandler()和Logger.removeHandler() | 为该logger对象添加和移除一个handler对象 |
Logger.addFilter()和Logger.removeFilter() | 为该logger对象添加和移除一个filter对象 |
- logger对象配置完成后,将使用下面的方法来创建日志记录:
方法 | 描述 |
---|---|
Logger.debug(),Logger.info(),Logger.warning(),Logger.error(),Logger.critical() | 创建一个与它们方法名对应等级的日志记录 |
Logger.exception() | 创建一个类似于Logger.error()日志的消息 |
Logger.log() | 需要获取一个明确的日志level参数来创建一个日志记录 |
-
Logger.exception()与Logger.error()的区别:Logger.exception()将会输出堆栈追踪信息,另外通常只是在一个exception handler中调用该方法。
-
Logger.log()与Logger.debug、Logger.info()等方法相比,虽然需要多传一个level参数,显得方便,但是当需要记录自定义level的日志时还是需要该方法完成。
-
如何得到logger对象?
- 通过logger类的实例化方法创建一个logger类的实例
- 通过logging.getLogger()方法–>logger = logging.getLogger(logger_name)
- 创建之后logger.setLevel(logging.ERROR) # 设置日志级别为 ERROR,即只有日志级别大于等于 ERROR 的日志才会输出
- logger.addHandler(handler_name) # 为 Logger 实例增加一个处理器或logger.removeHandler(handler_name) # 为 Logger 实例删除一个处理器
-
其他:
- 初始化 logger = logging.getLogger(“endlesscode”),获取 logger 对象,getLogger() 方法后面最好加上所要日志记录的模块名字,配置文件和打印日志格式中的 %(name)s 对应的是这里的模块名字,如果不指定name则返回root对象。
- logger.setLevel(logging.DEBUG),Logging 中有 NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志。
- 多次使用相同的name调用 getLogger 方法返回同一个 looger 对象。
1.6.2 Handler类
- Handler对象的作用是(基于日志消息的level)将消息分发到handler指定的位置。Logger对象可以通过addHandler()方法为自己添加0个或多个handler对象。
- 如,一个应用程序可能需要实现以下日志需求:
- 把所有日志都发送到一个日志文件中
- 把所有严重级别大于等于error的日志发送到stdout(标准输出)
- 把所有严重级别为critical的日志发送到一个email邮件地址。
- 这种就需要3个不同的handlers,每个handler负责发送一个特定严重级别的日志到一个特点的位置。
- handler配置方法:
方法 | 描述 |
---|---|
Handler.setLevel() | 设置handler将会处理的日志消息的最低严重级别 |
Handler.setFormatter() | 为handler设置一个格式化对象 |
Handler.addFilter和Handler.removerFilter() | 为handler添加和删除一个过滤器对象 |
1.6.3 Handler常用的行为
-Handler是一个基类,不能实例化。
方法 | 描述 |
---|---|
logging.StreamHandler | 将日志消息发送到Stream,如:std.out,std.err或任何filer-like对象 |
logging.FileHandler | 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 |
logging.handler.RotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按大小切割 |
logging.hanlders.TimedRotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按时间切割 |
logging.handlers.HTTPHandler | 将日志消息以GET或POST的方式发送给一个HTTP服务器 |
logging.handlers.SMTPHandler | 将日志消息发送给一个指定的email地址 |
logging.NullHandler | 该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免’No handlers could be found for logger XXX’信息的出现。 |
1.6.4 Formater类
- Formater对象用于配置日志消息的最终顺序、结构和内容。
- Formater类的构造:
- logging.Formatter.init(fmt=None, datefmt=None, style=’%’)
- fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
- datefmt:指定日期格式字符串,如果不指定该参数则默认使用”%Y-%m-%d %H:%M:%S”
- style:Python 3.2新增的参数,可取值为 ‘%’, ‘{‘和 ‘$’,如果不指定该参数则默认使用’%’
1.6.5 Filter类
- Filter过滤器基类,它只允许某个logger层级下的日志事件通过过滤。
- 一条日志信息被输出要经过以下几次过滤:
- 日志器等级过滤
- 日志器的过滤器过滤
- 日志器的处理器等级过滤
- 日志器的处理器的过滤器过滤
1.7 配置logging的方式
- 使用python代码显示的创建loggers,handlers和formatters并分别调用它们的配置函数。
- 创建一个日志配置文件,然后使用fileConfig()函数来读取该文件的内容。
- 创建一个包含配置信息的dict,然后把它传递给dictConfig()函数。
网友评论