python标准库之日志

日志对于系统开发的开发、调试和运行整个过程中都起着很重要的作用,调试阶段需要查看日志来明确问题所在,运行阶段如果程序崩溃,日志可以记录程序崩溃的相关原因。python的标准库里的logging模块从Python2.3开始支持,包含四大组件:

组件 说明
logger 提供应用程序代码直接使用的接口
handler 用于将日志记录发送到指定的目的位置
filter 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略)
formatter 用于控制日志信息的最终输出格式

logger对象的声明

1
2
3
4
5
# 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

可用来输出日志到任何类似文件流的对象,典型例子是输出到控制台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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

将日志输出发送到磁盘文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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可以完成比级别更复杂的过滤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 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")

LogRecord的属性

logging模块中的formatter格式器

formatter可以设置日志信息的结构和内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 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 模块提供了向日志消息添加各种详细信息的速记表