一 .logging模块相关概念
1.1简介
logging模块,日志记录是一种跟踪某些软件运行时发生的事件的方法。软件开发人员将日志调用添加到他们的代码中,以指示发生了某些事件。事件是由描述性消息描述的,该消息可以选择性地包含变量数据(也就是说,对于事件的每一次发生,数据可能是不同的)。可以设置输出日志的等级、日志保存路径、日志文件回滚等,日志记录为简单的日志记录使用提供了4个函数函数:debug()、info()、warning()、error()和critical() ,稍后会详细介绍。
对比print,日志具备如下优点:
-
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
-
print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
1.2作用
我们通过记录和分析日志可以了解一个系统或软件程序运行情况是否正常,也可以在应用程序出现故障时快速定位问题。 日志的作用可以简单总结为以下3点:
-
程序调试
-
了解软件程序运行情况,是否正常
-
软件程序运行故障分析与问题定位
1.3什么时候使用日志
需要做的任务 | 最适合的方法 |
---|---|
用于命令行脚本或程序的普通使用的显示控制台输出 | print() |
报告程序正常运行期间发生的事件(如状态监视或故障调查) | logging.info() 或者logging.debug() [debug是非常详细的输出] |
针对特定的运行时事件发出警告 | 1.warnings.warn() 如果问题是可以避免的,并且应该修改客户机应用程序以消除警告 2.logging.warning() 如果客户机应用程序对这种情况无能为力,但是仍然应该注意这个事件 |
报告关于特定运行时事件的错误 | 引发一个异常 |
报告在不引发异常的情况下抑制错误(例如,在长时间运行的服务器进程中错误处理程序) | logging.error(), logging.exception() or logging.critical() 适特定的错误和应用领域 |
1.4日志等级
日志共有5个级别,由高到低分别是CRITICAL > ERROR > WARNING > INFO > DEBUG
级别 | 使用 |
---|---|
DEBUG | 详细信息,调试问题时用到 |
INFO | 表明程序按照预期运行 |
WARNING | 程序出现一些意外,或者在将来可能出现问题,目前程序仍可正常运行 |
ERROR | 程序的部分功能已经不可用 |
CRITICAL | 程序崩溃,已经不能继续运行 |
默认级别是警告,这意味着只有这个级别和更高级别的事件才会被跟踪,除非日志包被配置成不这样做。
注:开发应用程序或部署开发环境时,可以使用DEBUG或INFO级别的日志获取尽可能详细的日志信息来进行开发或部署调试;应用上线或部署生产环境时,应该使用WARNING或ERROR或CRITICAL级别的日志来降低机器的I/O压力和提高获取错误日志信息的效率。日志级别的指定通常都是在应用程序的配置文件中进行指定的。
1.5日志字段信息与日志格式
一个事件通常需要包括以下几个内容:
-
事件发生时间
-
事件发生位置
-
事件的严重程度--日志级别
-
事件内容
上面这些都是一条日志记录中可能包含的字段信息,当然还可以包括一些其他信息,如进程ID、进程名称、线程ID、线程名称等。日志格式就是用来定义一条日志记录中包含那些字段的,且日志格式通常都是可以自定义的。
二.logging模块介绍
logging模块定义的模块级别的常用函数
函数 说明 logging.debug(msg, *args, **kwargs) 创建一条严重级别为DEBUG的日志记录 logging.info(msg, *args, **kwargs) 创建一条严重级别为INFO的日志记录 logging.warning(msg, *args, **kwargs) 创建一条严重级别为WARNING的日志记录 logging.error(msg, *args, **kwargs) 创建一条严重级别为ERROR的日志记录 logging.critical(msg, *args, **kwargs) 创建一条严重级别为CRITICAL的日志记录 logging.log(level, *args, **kwargs) 创建一条严重级别为level的日志记录 logging.basicConfig(**kwargs) 对root logger进行一次性配置 其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。
logging模块的四大组件
组件 说明 loggers 提供应用程序代码直接使用的接口 handlers 用于将日志记录发送到指定的目的位置 filters 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略) formatters 用于控制日志信息的最终输出格式 三.举例
1.最简单的使用
import logging logging.debug("This is a debug log.") logging.info("This is a info log.") logging.warning("This is a warning log.") logging.error("This is a error log.") logging.critical("This is a critical log.")
同样可以这样写
import logging logging.log(logging.DEBUG, "This is a debug log.") logging.log(logging.INFO, "This is a info log.") logging.log(logging.WARNING, "This is a warning log.") logging.log(logging.ERROR, "This is a error log.") logging.log(logging.CRITICAL, "This is a critical log.")
WARNING:root:This is a warning log. ERROR:root:This is a error log. CRITICAL:root:This is a critical log.
输出的日志各字段的含义是:
日志级别:日志器名称:日志内容
之所以会这样输出,是因为logging模块提供的日志记录函数所使用的日志器设置的日志格式默认是BASIC_FORMAT,其值为:
"%(levelname)s:%(name)s:%(message)s"
这些函数都会调用logging.basicConfig来配置日志输出文件
2.logging.basicConfig函数
2.1 参数说明:
参数名称 | 描述 |
---|---|
filename | 指定日志输出目标文件的文件名,指定该设置项后日志信心就不会被输出到控制台了 |
filemode | 指定日志文件的打开模式,默认为'a'。需要注意的是,该选项要在filename指定时才有效 |
format | 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出。 |
datefmt | 指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效 |
level | 指定日志器的日志级别 |
stream | 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 |
style | Python 3.2中新添加的配置项。指定format格式字符串的风格,可取值为'%'、'{'和'$',默认为'%' |
handlers | Python 3.3中新添加的配置项。该选项如果被指定,它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到root logger。需要说明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发ValueError异常。 |
2.2 format 参数中定义好的格式字符串
字段/属性名称 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896 |
created | %(created)f | 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值 |
relativeCreated | %(relativeCreated)d | 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的) |
msecs | %(msecs)d | 日志事件发生事件的毫秒部分 |
levelname | %(levelname)s | 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') |
levelno | %(levelno)s | 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50) |
name | %(name)s | 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger |
message | %(message)s | 日志记录的文本内容,通过 msg % args 计算得到的 |
pathname | %(pathname)s | 调用日志记录函数的源码文件的全路径 |
filename | %(filename)s | pathname的文件名部分,包含文件后缀 |
module | %(module)s | filename的名称部分,不包含后缀 |
lineno | %(lineno)d | 调用日志记录函数的源代码所在的行号 |
funcName | %(funcName)s | 调用日志记录函数的函数名 |
process | %(process)d | 进程ID |
processName | %(processName)s | 进程名称,Python 3.1新增 |
thread | %(thread)d | 线程ID |
threadName | %(thread)s | 线程名称 |
2.3经过配置的日志输出
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='myapp.log', filemode='w') logging.debug('This is debug message') logging.info('This is info message') logging.warning('This is warning message')
#输出:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message
参考:
https://docs.python.org/3.5/howto/logging.html
https://www.cnblogs.com/testdjt/p/7834856.html