Python 代码日志之logging的解析与使用
平时都是用别人的代码,看别人的在用logging和logger, 不知道如何使用,总是把别人的复制来复制去,今天抽空学习一下,别做个笔记,方便查阅。
一、基本概念
日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生某些事情。一个事件可以用一个可包含可选变量数据的消息来描述。此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(Level).
主要作用
- 程序调试
- 了解软件程序运行情况,是否正常
- 软件程序运行故障分析与问题定位
值得思考的两个问题:
- 在开发一个应用程序时需要什么样的日志信息? 在应用程序正式上线后需要什么日志信息?
- 在部署开发环境时需要什么样的日志信息?在部署生产环境时需要什么日志信息?
不同的应用程序所定义的日志等级可能会有所差别,Level的几个等级分别是:
DEBUG INFO NOTICE WARNING ERROR CRITICAL ALERT EMERGENCY
日志中可能需要包含的信息有
- 事件发生时间
- 事件发生位置
- 事件的严重程度--日志级别
- 事件的内容
还可以包含一些具体的消息:进程ID,进程名称,线程ID, 线程名称等。
二、logging模块解析
1. logging.basicConfig() 函数,主要参数:
(1)level 代表高于或等于这个值时,那么我们才会记录这条日志;
日志等级(level) | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型应用场景是 问题诊断 |
INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
上面列表中的日志等级是从上到下依次升高的,即:DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;
(2)filename代表日志会写在这个文件之中,如果没有这个字段则会显示在控制台上;
(3)format代表我们的日志显示的格式自定义。默认情况时level:log_name:content
不多说了,直接上代码感受一下吧。
需要注意的是 如果使用WARNING的日志级别,只有WARNING级别的日志记录以及大于它的ERROR和CRITICAL级别日志记录被输出,而小于它的DEBUG 和 INFO级别日志记录被丢弃了。
import logging
LOG_FORMAT = "%(asctime)s=====%(levelname)s+++++++++(message)"
logging.basicConfig(filename='log1.txt', level=logging.WARNING, format=LOG_FORMAT)
logging.log(logging.INFO, "This is a INFO log")
logging.log(logging.ERROR, ""This is a ERROR log.")
2. logging模块的处理流程
四个组件
(1)日志器(Logger):产生日志的一个接口。
(2)处理器(Handler):把产生的日志发送到相应的目的地。
(3)过滤器(Filter): 更精细的控制那些日志输出, 用于决定哪些日志记录将会被输出。
(4)格式器(Formatter): 对输出的信息进行格式化。
接下来介绍Logger和Handler组件的使用和说明:
Logger
# Logger : 功能是产生一个日志
# 具体的操作
Logger.setLevel() # 设置日志器将会处理的日志消息的最低严重级别
Logger.addHandler() # 为Logger对象添加一个handler对象
Logger.moveHander() # 为Logger对象移除一个handler对象
Logger.addFilter() # 为Logger对象增加一个filter对象
Logger.moveFilter() # 为Logger对象移除一个filter对象
Logger.debug: # 产生一条debug级别日志,同理,info, error的日志消息
Logger.exception # 创建一个类似于Logger.error的日志消息
Logger.log() # 获取一个明确的日志Level参数类型创建一个日志记录
# 得到一个logger对象
logging.getLogger()
Handler
# 把log发到指定位置
# 方法
logging.StreamHandler #将日志消息发送到输出端Stream。如std.out,std.err或任何file-like
logging.FileHandler #将日志消息发送到磁盘文件。默认情况下文件大小会无限增长
logging.handlers.RotatongFileHandler #将日志消息发送到磁盘文件,并支持日志文件按大小切割
logging.handlers.TimeRotatingFileHandler #将日志消息发送到磁盘文件,并支持日志文件按时间切割
logging.handlers.HTTPHandler #将日志消息以GET或POST的方式发送到一个指定email地址
logging.NullHandler #该Handler实例会忽略error message 通常想被想使用logging的library
这篇博客只是提到了一些日志设置内容,需要学习的内容挺多的,日后补充。日志的设置可以高效我们代码的开发。
这里也需要给出一些参考文章(这些文章写这篇博文时时存在的):
[1] https://www.cnblogs.com/yyds/p/6901864.html
[2]https://www.cnblogs.com/yyds/p/6897964.html