Python logging日志模块的使用
在实际的开发过程中,为了方便调试程序,记录系统的运行状态及错误等,及时发现系统的问题并快速定位问题,通常会使用日志。下面来介绍下在Python项目中如何使用日志。
Python提供了一个用于记录日志的标准库模块logging,主要用于进行格式化内容输出,可将格式化内容输出到屏幕或者文件。logging模块实现了许多强大的函数和类,可以为应用程序提供一个灵活的事件日志系统。
logging的简单使用
日志级别
logging模块日志级别有DEBUG、INFO、WARNING、ERROR、CRITICAL五种。
级别 | 数值 | 使用范围 |
---|---|---|
CRITICAL | 50 | 产生了不可逆的错误,导致系统无法正常工作时 |
ERROR | 40 | 程序发生错误,某些功能不能正常运行时 |
WARNING | 30 | 打印警告信息,系统还在正常运行 |
INFO | 20 | 通常只记录程序中一般事件的信息,用于确认工作一切正常 |
DEBUG | 10 | 一般在功能开发阶段使用,检查系统功能是否正常 |
级别排序:DEBUG < INFO < WARNING < ERROR < CRITICAL。级别最低的是DEBUG,级别最高的是CRITICAL。 设置了日志级别后,调用比级别低的日志记录函数不会输出任何信息,例如setLevel(logging.INFO),此时函数参数为INFO,那么该logger将只会处理INFO、WARNING、ERROR和CRITICAL级别的日志,而DEBUG级别的消息将会被忽略。
日志输出
import logging
logging.debug("这条日志是debug级别")
logging.info("这条日志是info级别")
logging.warning("这条日志是warning级别")
logging.error("这条日志是error级别")
logging.critical("这条日志是critical级别")
执行结果为:
通过结果,你会发现调用debug()和info()方法没有输出任何信息,这是因为默认的日志级别是ERROR,上面我们说了调用比级别低的日志记录函数不会输出任何信息,所以低于ERROR级别的日志不会输出。想要输出的话要更改日志级别,可以使用logging模块的basicConfig()方法修改日志级别。
import logging
logging.basicConfig(level=logging.DEBUG) # 修改日志级别为DEBUG
logging.debug("这条日志是debug级别")
logging.info("这条日志是info级别")
logging.warning("这条日志是warning级别")
logging.error("这条日志是error级别")
logging.critical("这条日志是critical级别")
执行结果为:
设置日志输出格式
上面输出结果中每行日志信息的格式是 日志级别:日志器名称:日志内容,之所以会这样输出,是因为logging模块提供的日志记录函数所使用的日志器的默认日志格式为BASIC_FORMAT,其值为:%(levelname)s:%(name)s:%(message)s
我们可以根据以下进行日志输出格式的自定义:
格式 | 说明 |
---|---|
%(levelno)s | 日志级别的数值 |
%(levelname)s | 日志级别的名称 |
%(pathname)s | 当前执行程序的路径 |
%(filename)s | 当前执行程序名 |
%(funcName)s | 日志的当前函数 |
%(lineno)d | 日志的当前行号 |
%(asctime)s | 日志的时间 |
%(thread)d | 线程ID |
%(threadName)s | 线程名称 |
%(process)d | 进程ID |
%(message)s | 日志信息 |
设置日志输出格式的例子如下:
import logging
log_formatter = '%(levelname)s %(asctime)s %(filename)s:第%(lineno)d行: %(message)s'
logging.basicConfig(level=logging.DEBUG, format=log_formatter)
logging.debug("这条日志是debug级别")
logging.info("这条日志是info级别")
logging.warning("这条日志是warning级别")
logging.error("这条日志是error级别")
logging.critical("这条日志是critical级别")
执行结果为:
logger的高级用法
如果只是简单的使用logging模块,那么使用上面的方法基本就可以满足了,但是logging模块的用法不止如此,下面来看一下。 logging模块采用了模块化设计,主要包含四种组件:
- Loggers:日志器,提供应用程序直接调用的接口
- Handlers:处理器,决定将日志记录分配至正确的目的地;
- Filters:过滤器,提供更好的粒度控制,对日志信息进行过滤,决定哪些日志会被输出
- Formatters:格式器,设置日志记录的输出格式
在实际操作中使用logging的步骤一般是:先创建日志记录器,再设置日志级别,再创建日志文件,再设置日志格式,最后再将日志处理程序记录到记录器。
使用示例:
import logging
from logging.handlers import RotatingFileHandler
# 创建日志记录器
logger = logging.getLogger()
# 设置日志级别
logger.setLevel(logging.DEBUG)
# 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
file_log_handler = RotatingFileHandler("logs/test.log", maxBytes=1024 * 1024 * 100, backupCount=10)
# 创建日志记录的格式
formatter = logging.Formatter('%(levelname)s %(asctime)s %(filename)s:第%(lineno)d行: %(message)s')
# 设置日志记录格式
file_log_handler.setFormatter(formatter)
stream_handler = logging.StreamHandler() # 往屏幕上输出
# 添加日志记录器
logging.getLogger().addHandler(file_log_handler)
logging.getLogger().addHandler(stream_handler)
logging.debug("这条日志是debug级别")
logging.info("这条日志是info级别")
logging.warning("这条日志是warning级别")
logging.error("这条日志是error级别")
logging.critical("这条日志是critical级别")
通过上面示例代码,我们可以把日志输出到文件,如果想要把日志同时输出在文件和屏幕上,还需要再创建并添加一个往屏幕上输出的日志处理器器:logging.StreamHandler()。
总结
以上就是Python中日志模块logging的使用,日志记录是程序开发中很重要的一部分,如果你还没开始使用或者还在使用print记录的话,快去用起来吧。
最后,感谢女朋友在工作和生活中的包容、理解与支持 !
转载自:https://juejin.cn/post/6999141913152454692