日志对于系统开发的开发、调试和运行整个过程中都起着很重要的作用,调试阶段需要查看日志来明确问题所在,运行阶段如果程序崩溃,日志可以记录程序崩溃的相关原因。python的标准库里的logging模块从Python2.3开始支持,包含四大组件:
组件 |
说明 |
logger |
提供应用程序代码直接使用的接口 |
handler |
用于将日志记录发送到指定的目的位置 |
filter |
提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略) |
formatter |
用于控制日志信息的最终输出格式 |
logger对象的声明
1 2 3 4 5
| 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
| import logging
logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG)
shander = logging.StreamHandler() shander.setLevel(logging.DEBUG)
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
| import logging
logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG)
fhander = logging.FileHandler("debug.log", mode='w') fhander.setLevel(logging.DEBUG)
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
| import logging
logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG)
shander = logging.StreamHandler() shander.setLevel(logging.DEBUG)
def should_log(record): ''' 返回一条日志是否应该被记录 ''' if record.msg.startswith("this"): return False return True
filter1 = logging.Filter() filter1.filter = should_log
logger.addHandler(shander)
logger.addFilter(filter1)
logger.debug("this is a debug") logger.debug("that is a debug")
|
LogRecord的属性
formatter可以设置日志信息的结构和内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| import logging
logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG)
shander = logging.StreamHandler() shander.setLevel(logging.DEBUG)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") shander.setFormatter(formatter)
logger.addHandler(shander)
logger.debug("this is a debug")
|
logging 模块提供了向日志消息添加各种详细信息的速记表