logging是python标准库中的最常使用包的之一,可以放便我们进行问题排查,输出一下我们希望输出的内容信息,总结一些常用的方式,放便使用
包的引入
因为是Python标准库的内容,所以不需要进行再进行其他安装,只需要安装有Python就可以,直接import
import logging
配置日志打印格式
日志有6个级别:NOTSET<DEBUG < INFO < WARNING < ERROR < CRITICAL
一般使用如下示例的格式即可:【高于设定级别的信息都会输出,我们一般关心的都是ERROR的信息,但是有时侯我们会用info级别来输出一些内容帮助校验内容方法返回的内容,这些内容一般都设置为info内容的信息,所以建议用下面的格式即可】
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
图片是官网上对于级别的说明【官网地址:https://docs.python.org/3.11/library/logging.html#logging-levels】
包的常见使用
1.除了本身logging包会捕捉程序中的一些报错日志,我们也可以自己设定,来进行我们一些日志的输出
if State == 0:
logging.info("任务初始化中================================================================")
elif State == 1:
logging.info("任务进行中================================================================")
elif State == 3:
logging.info("数据写入中================================================================")
elif State == 4:
logging.info("任务排队中================================================================")
elif State == -1 or State == -3:
logging.error(
"任务失败或被删除")
break *#* *任务失败或被删除,跳出循环
*else:
logging.error("未知的任务状态")
不同的日志级别调用不同方法上面使用到的是info()、error(),你也可以设置任意其他可选级别,但是如果你使用了低于info()级别的方法,想使其正常输出的话,上买logging.basicConfig(level=logging.INFO)级别也要对应修改
另外这里只是对日志进行了打印,自己写的logging.error()不会中断代码的运行,如果你想在输出错误级别的日志时,阻断任务的继续进行,需要结合异常来进行
下面是一个使用ValueError来阻断的示例:
# @Time: 2024/4/11 15:31
# @Author shushan
import logging
import Mylib
logger = logging.getLogger(__name__)
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def main():
# 配置日志
try:
# 假设这里有一段可能会出错的代码
raise ValueError("这里有一个错误。")
except ValueError as e:
logging.error(f"捕获到错误: {e}")
# 选择性地,你可以在这里抛出异常或执行其他逻辑
# raise
print("Starting")
if __name__ == '__main__':
main()
控制台输出结果:
拓展:
根据自己的喜好设置日志格式
在logging.basicConfig()中有多个参数可以设置,可以根据自己的想法设定日志的,下面列出一些常见的日志参数
以logging.basicConfig(level=logging.INFO, format=‘%(asctime)s - %(levelname)s - %(message)s’)为例
用到了两个参数:
**level:**设定日志输出的级别,高于这个级别的的日志都会被输出
**format:**设定日志的输出格式,比如format=‘%(asctime)s - %(levelname)s - %(message)s’)
这里的日志的输出格式为「时间+日志级别+日志信息」【参考上面图片的日志输出格式】,在 Python 的 logging
模块中,像 %(asctime)s
这样的参数被称为日志记录格式化字段。这些字段是在 logging
模块的 LogRecord
对象中定义的。LogRecord
对象自动为每一个日志事件创建,并包含了与该事件相关的所有信息,例如时间戳、日志级别和消息文本等,除了asctime、levelname、message外,还有很多参数可以用来规范格式例
可以查看官网:https://docs.python.org/3.11/library/logging.html#logrecord-objects
另外还有一些常用的参数:
**filename:**日志输出地址的文件名
datefmt: 规定日志输出时间的格式
**funcName:**输出打印日志所在的方法的名称,帮助定位出现报错的位置
更多的参数可以查看官方网站【注意要结合自己的python的具体版本,不同版本的标准库参数有所差异】:
https://docs.python.org/3.11/library/logging.html#logrecord-objects
如何每个方法使设置不同的日志级别
我们使用logging.basicConfig(level=logging.INFO, format=‘%(asctime)s - %(levelname)s - %(message)s’)进行日志的格式设置之后,如果针对不同的方法中,我们想输出不同格式的日式,是不能实现的,因为logging.basicConfig()只会在第一次生效,有多次的logging.basicConfig()配置情况,都会被覆盖,那如果我们想在同一个模块的不同方法使用不同的日志格式,可以通过为每个函数或需要特定格式的代码块配置独立的日志处理器(logger)和格式器(formatter)来实现。
def function1():
# 创建一个日志记录器
logger1 = logging.getLogger('Function1')
logger1.setLevel(logging.DEBUG) # 设置日志级别
# 创建一个日志处理器,这里使用控制台输出
handler1 = logging.StreamHandler()
# 创建并设置日志格式
formatter1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler1.setFormatter(formatter1)
# 添加处理器到日志记录器
logger1.addHandler(handler1)
# 使用日志记录器
logger1.info("This is an info message from Function 1")
def function2():
# 创建一个日志记录器
logger2 = logging.getLogger('Function2')
logger2.setLevel(logging.ERROR) # 设置日志级别
# 创建一个日志处理器,这里使用控制台输出
handler2 = logging.StreamHandler()
# 创建并设置另一种日志格式
formatter2 = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
handler2.setFormatter(formatter2)
# 添加处理器到日志记录器
logger2.addHandler(handler2)
# 使用日志记录器
logger2.error("This is an error message from Function 2")