日志对于系统开发的开发、调试和运行整个过程中都起着很重要的作用,调试阶段需要查看日志来明确问题所在,运行阶段如果程序崩溃,日志可以记录程序崩溃的相关原因。python的标准库里的logging模块从Python2.3开始支持,包含四大组件:
组件 | 说明 |
---|---|
logger | 提供应用程序代码直接使用的接口 |
handler | 用于将日志记录发送到指定的目的位置 |
filter | 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略) |
formatter | 用于控制日志信息的最终输出格式 |
logger对象的声明
# coding=utf-8
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger为日志对象是logging模块中最基础的对象。
设置logger的level可以指定哪些级别的日志才会被输出。一共有五个等级,从低到高日志的信息量是依次减少。当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息。
严重等级 | 描述 |
---|---|
DEBUG | 最详细的日志信息,典型应用场景是 问题诊断 |
INFO | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
logging模块中的handler处理器
handler处理器用于设置日志发送的路径
1、StreamHandler
可用来输出日志到任何类似文件流的对象,典型例子是输出到控制台
# coding=utf-8
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建StreamHandler输出到控制台
shander = logging.StreamHandler()
shander.setLevel(logging.DEBUG)
# 添加handlers到logger
logger.addHandler(shander)
# 测试
logger.debug("this is a debug")
2、FileHandler
将日志输出发送到磁盘文件
# coding=utf-8
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建FileHandler输出到磁盘
fhander = logging.FileHandler("debug.log", mode='w')
fhander.setLevel(logging.DEBUG)
# 添加handlers到logger
logger.addHandler(fhander)
# 测试
logger.debug("this is a debug")
logging模块中的filter过滤器
使用filter可以完成比级别更复杂的过滤
# coding=utf-8
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建StreamHandler输出到控制台
shander = logging.StreamHandler()
shander.setLevel(logging.DEBUG)
# 添加一个Filter规则
def should_log(record):
'''
返回一条日志是否应该被记录
'''
if record.msg.startswith("this"):
return False
return True
filter1 = logging.Filter()
filter1.filter = should_log
# 添加handlers到logger
logger.addHandler(shander)
# 添加filter到logger
logger.addFilter(filter1)
# 测试
logger.debug("this is a debug")
logger.debug("that is a debug")
logging模块中的formatter格式器
formatter可以设置日志信息的结构和内容
# coding=utf-8
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建StreamHandler输出到控制台
shander = logging.StreamHandler()
shander.setLevel(logging.DEBUG)
# 创建 logging format
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
shander.setFormatter(formatter)
# 添加handlers到logger
logger.addHandler(shander)
# 测试
logger.debug("this is a debug")
logging 模块提供了向日志消息添加各种详细信息的速记表
网友评论