1.日志的作用
1.程序调试 ; 2.了解软件程序运行情况,是否正常; 3.软件程序运行故障分析与问题定位
2.日志的等级
日志等级(level) | 数值 | 描 述 |
NOTSET | 0 | |
DEBUG | 10 | 最详细的日志信息,典型应用场景是 问题诊断 |
INFO | 20 | 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作 |
WARNING | 30(默认) | 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的 |
ERROR | 40 | 由于一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 50 | 当发生严重错误,导致应用程序不能继续运行时记录的信息 |
上面列表中的日志等级是从上到下依次升高的,即:NOTSET<DEBUG < INFO < WARNING < ERROR < CRITICAL,而日志的信息量是依次减少的;
eg.
---------------返回结果----------------------------
默认 显示warning及以上的所有级别
3.日志字段信息一般格式
- 事件发生时间
- 事件发生位置
- 事件的严重程度--日志级别
- 事件内容
4.日志功能的实现
Python自身也提供了一个用于记录日志的标准库模块--logging。
logging模块提供了两种记录日志的方式:
第一种:logging提供的模块级别的函数
第二种:使用Logging日志系统的四大组件(Loggers,Handlers,Filters,Formatters),其实,logging提供的模块级别的函数,也是对logging日志系统相关类的封装而已。
主要包括四部分:
- Loggers: 可供程序直接调用的接口,app通过调用提供的api来记录日志
- Handlers: 决定将日志记录分配至正确的目的地
- Filters:对日志信息进行过滤, 提供更细粒度的日志是否输出的判断
- Formatters: 制定最终记录打印的格式布
可见在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open('test.log','w')),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:
%(levelno)s: 打印日志级别的数值
%(levelname)s: 打印日志级别名称
%(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
%(filename)s: 打印当前执行程序名
%(funcName)s: 打印日志的当前函数
%(module)s 调用日志输出函数的模块名
%(name)s : 所使用的日志名称,默认是'root',因为默认使用的是 rootLogger
%(msecs)d 日志事件发生事件的毫秒部分
%(lineno)d: 打印日志的当前行号
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的)
%(thread)d: 打印线程ID
%(threadName)s: 打印线程名称
%(process)d: 打印进程ID
%(message)s: 打印日志信息
6.logging.basicConfig()函数其它说明
logging.basicConfig()函数是一个一次性的简单配置工具,也就是说只有在第一次调用该函数时会起作用,后续再次调用该函数时完全不会产生任何操作的,多次调用的设 置并不是累加操作。
日志器(Logger)是有层级关系的,上面调用的logging模块级别的函数所使用的日志器是RootLogger类的实例,其名称为'root',它是处于日志器层级关系最顶层的日志器,且该实例是以单例模式存在的。
如果要记录的日志中包含变量数据,可使用一个格式字符串作为这个事件的描述消息(logging.debug、logging.info等函数的第一个参数),然后将变量数据作为第二个参数*args的值进行传递,如:logging.warning('%s is %d years old.', 'Tom', 10),输出内容为WARNING:root:Tom is 10 years old.
logging.debug(), logging.info()等方法的定义中,除了msg和args参数外,还有一个**kwargs参数。
它们支持3个关键字参数: exc_info, stack_info, extra,下面对这几个关键字参数作个说明。
exc_info: 其值为布尔值,如果该参数的值设置为True,则会将异常异常信息添加到日志消息中。如果没有异常信息则添加None到日志信息中。
stack_info: 其值也为布尔值,默认值为False。如果该参数的值设置为True,栈信息将会被添加到日志信息中。
extra: 这是一个字典(dict)参数,它可以用来自定义消息格式中所包含的字段,但是它的key不能与logging模块定义的字段冲突。