阅读 24

python之日志处理(logging模块)

参考文档:https://blog.csdn.net/xun527/article/details/78968546
复制代码

什么是日志?

日志是一种可以追踪某些软件运行时所发生事件的方法。通过log的分析,可以方便用户了解系统或软件、应用的运行情况。简单来说,我们通过记录和分析日志可以了解一个系统或软件程序运行情况是否正常,也可以在应用程序出现故障时快速定位问题。

logging模块简介

logging模块是Python的一个标准库模块,由标准库模块提供日志记录API的关键好处是所有Python模块都可以使用这个日志记录功能。所以,你的应用日志可以将你自己的日志信息与来自第三方模块的信息整合起来。

logging模块的日志级别

logging模块默认定义了以下几个日志等级,它允许开发人员自定义其他日志级别,但是这是不被推荐的。

日志等级(level)描述
DEBUG最详细的日志信息,典型应用场景是问题诊断
INFO信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING当某些不期望的事情发生时记录的信息(如:磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL当发生严重错误,导致应用程序不能继续运行时记录的信息

上面列表中的日志等级是从上到下一次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的。

logging模块的使用方式介绍

logging模块提供了两种记录日志的方式:

  • 第一种方式是使用logging提供的模块级别的函数
  • 第二种方式是使用logging日志系统的四大组件

其实,logging所提供的模块级别的日志记录函数也是对logging日志系统相关类的封装而已。

logging模块的四大组件:

组件名称对应类名功能描述
日志器Logger提供了应用程序可一直使用的接口
处理器Handler将logger创建的日志记录发送到合适的目的输出
过滤器Filter提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器Formatter决定日志记录的最终输出格式

这件组件之间的关系描述:

  • 日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等;
  • 不同的处理器(handler)可以将日志输出到不同的位置;
  • 日志器(logger)可以设置多个处理器(handler)将同一条日志输出到不同的位置;
  • 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志;
  • 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。

简单点说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。

logging模块使用实例

所有常用方法及使用说明:docs.python.org/zh-cn/3/lib…

import logging
import os.path
import time

# 记录器对象。注意 永远 不要直接实例化记录器,应当通过模块级别的函数 logging.getLogger(name) 。
# 多次使用相同的名字调用 getLogger() 会一直返回相同的 Logger 对象的引用。
logger = logging.getLogger()
# setLevel(level):给记录器设置阈值为 level 。
# 日志等级小于 level 会被忽略。严重性为 level 或更高的日志消息将由该记录器的任何一个或多个处理器发出,除非将处理器的级别设置为比 level 更高的级别。
logger.setLevel(logging.INFO)

rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
log_path = os.path.dirname(os.getcwd()) + '/Logs/'
log_name = rq + '.log'
print(log_name)

# 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长
fh = logging.FileHandler(log_name, mode='w')
# setLevel(level):给处理器设置阈值为 level。
# 日志级别小于 level 将被忽略。创建处理器时,日志级别被设置为 NOTSET (所有的消息都会被处理)
# debug<info<warning<error<critical
fh.setLevel(logging.DEBUG)

#Formater对象用于配置日志信息的最终顺序、结构和内容。与logging.Handler基类不同的是,应用代码可以直接实例化Formatter类。
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] -%(levelname)s:%(message)s")
# setFormatter(fmt): 将此处理器的 Formatter 设置为 fmt。
fh.setFormatter(formatter)

# addHandler(hdlr):将指定的处理器hdlr添加到此记录器。
logger.addHandler(fh)

# logging.debug(msg, *args, **kwargs):
# 在根日志记录器上记录一条 DEBUG 级别的消息。 msg 是消息格式字符串,而 args 是要使用字符串格式化运算符合并到 msg 的参数。
logger.debug('this is a logger debug message')
logger.info('this is a logger info message')
logger.warning('this is a logger warning message')
logger.error('this is a logger error message')
logger.critical('this is a logger critical message')

生产log文件如下:
2021-03-24 20:22:17,490 - log.py[line:23] -INFO:this is a logger info message
2021-03-24 20:22:17,491 - log.py[line:24] -WARNING:this is a logger warning message
2021-03-24 20:22:17,491 - log.py[line:25] -ERROR:this is a logger error message
2021-03-24 20:22:17,491 - log.py[line:26] -CRITICAL:this is a logger critical message
复制代码
文章分类
代码人生
文章标签