1.python:日志
logging模块提供了完整和灵活的日志系统。它最简单的用法是记录信息并发送到一个文件或sys.stderr
作用:
用于记录系统在运行过程中的一些关键信息,以便对于系统的运行状况进行跟踪。在python中我们不需要第三方的日志组件,因为它为我们提供了简单易用,功能强大的日志模块:logging。logging支持将日志保存信息保存在不同的目标域中。
例:
import logging
logging.basicConfig(filename='os.py',level=logging.DEBUG)
logging.debug('this is a bug')
将会在程序的根目录下创建一个os.py的文件,里面有一条记录为:DEBUG:root:this is bug
2.日志的4个主要的组件
loggers------提供应用程序代码直接使用的接口.
handlers-------对日志信息进行处理,用于将日志发送到指定位置.
filters------对日志信息进行过滤,用于决定哪些日志会被输出(剩下的将被省略)
formatters------日志的格式化,用于控制日志输出的最终形式
3.日志级别(levle)
级别 | 对应值 | 描述 |
DEBUG | 10 | 最详细的日志信息,典型应用场景是 问题诊断 |
INFO | 20 | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 30 | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 40 | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 50 | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
|
|
|
4.logging模块的使用方式
第一种使用方式:使用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进行一次性配置 |
5.格式
import logging
log_format='%(asctime)s %(levelname)s %(message)s'
logging.basciConfig(level='指定日志器的等级(如DEBUG)级别低的日志信息将被忽略',
formatter='指定日志的输出文件名,不在控制台输出',
format='指定日志的输出格式(log_format)',
datefmt='指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效 ')
logging.debug('this is bug')
6.打印出来各字段的意思
WARNING:root:This is a warning log.
日志级别:日志器名称:日志内容
这样输出的原因是logging模块提供的日志记录函数所使用的日志器设置的日志格式默认是BASIC_FORMAT,其值为:"%(levelname)s:%(name)s:%(message)s"
7.如果将日志输出在文件中,而不是在控制台,python默认指定日志输出的的文件名是sys.stderr
filename=要输出日志的文件名
8.logging.basicConfig()使用说明
定义方法:logging.basicConfig(**kwargs)
该函数可接收的关键字参数如下:
参数名称 | 描述 |
---|---|
filename | 指定日志输出目标文件的文件名,指定该设置项后日志信心就不会被输出到控制台了 |
filemode | 指定日志文件的打开模式,默认为'a'。需要注意的是,该选项要在filename指定时才有效 |
format | 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。logging模块定义的格式字段下面会列出。 |
datefmt | 指定日期/时间格式。需要注意的是,该选项要在format中包含时间字段%(asctime)s时才有效 |
level | 指定日志器的日志级别 |
stream | 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 ValueError 异常 |
style | Python 3.2中新添加的配置项。指定format格式字符串的风格,可取值为'%'、'{'和'$',默认为'%' |
handlers | Python 3.3中新添加的配置项。该选项如果被指定,它应该是一个创建了多个Handler的可迭代对象,这些handler将会被添加到root logger。需要说明的是:filename、stream和handlers这三个配置项只能有一个存在,不能同时出现2个或3个,否则会引发ValueError异常。 |
9.logging模块定义格式字符串字段用于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 | 线程名称 |
10.练习日志的输出
1.先简单配置一下日志器输出的级别
2.在配置日志器日志级别的基础上,在配置下日志输出目标文件和日志格式
此时发现在控制台上没有内容输出,这就说明已经常见了一个文件为you.log,内容显示在you.log文件中
在此基础上再设置一下日期格式
此时会在you.log日志文件中看到如下输出内容: