logging模块
日志
1 简介
追踪某些软件运行时所发生事件的方法, 可以在代码中调用日志中某些方法来记录发生的事情
- 一个事件可以用一个可包含可选变量数据的消息来描述
- 事件有自己的重要性等级
2 作用
通过对log的分析, 可以了解你想通过程序了解的事情
- 系统或软件、应用的运行情况
- 丰富的log还可以分析用户的操作行为、类型喜好、地域分布等其他信息
- 在一个应用中对log进行多级区分,可以分析应用的健康状况,并可以快速定位问题,加以解决
3 日志等级
等级区分可以让我们更好的‘避轻就重’,让我们在排查故障的时候免于淹没在日志的海洋里, 简单列举出所有的等级
- DEBUG
- INFO
- NOTICE
- WARNING
- ERROR
- CRITICAL
- ALERT
- EMERGENCY
4 日志字段信息和格式
日志即记录, 需要知道
- 时间
- 位置
- 严重级别
- 内容
- 其他
其中日志内容和级别需要明确指定, 其他字段信息只需要指出是否需要显示
logging
1 logging日志级别
虽然可以自定义日志等级, 但是建议使用默认等级
DEBUG
最详细日志信息, 多用于问题诊断INFO
仅次于DEBUG, 多用于记录关键点信息, 确保程序按预期执行
WARNING
低等级故障, 但程序仍能运行, 如磁盘空间不足警告ERROR
由于比WARNING严重的问题, 导致某些功能不能正常运行时的记录CRITICAL
严重错误, 导致应用程序不能继续运行时的记录
开发部署阶段, 使用DEBUG或INFO获取尽可能详尽的日志来进行开发;
上线时应该使用WARNING或ERROR或CRITICAL级别日志来降低机器I/O压力, 提高获取日志信息的效率
DEBUG < INFO < WARNING < ERROR < CRITICAL
指定某级别后, 记录此级别以及更高级别的日志信息, 而不仅仅只记录指定级别
使用方式
1. 使用logging提供的模块级别函数
函数说明
a logging.五个级别(msg, *args, **kwargs)
创建这几个级别的日志记录
b logging.log(level, *args, **kwargs)
创建级别为level的日志记录
c logging.basicConfig(**kwargs)
进行一次性配置
其中
basicConfig
用于指定 日志级别 日志格式 日志输出位置 日志文件的打开模式;
2. 使用logging日志系统四大组件
a loggers
提供应用程序代码直接使用的接口
b handlers
用于将日志记录发送到指定的目的位置
c filters
过滤, 决定哪些输出哪些日志记录, 其余忽略
d formatters
控制日志输出格式
logging模块级别实际上是使用这四大组件加上一些基础配置实现的
模块级别函数使用
尝试使用:
In [1]: import logging
In [2]: logging.debug('debug')
In [3]: logging.info('info')
In [4]: logging.warning('warning')
WARNING:root:warning
In [5]: logging.error('error')
ERROR:root:error
In [6]: logging.critical('critical')
CRITICAL:root:critical
发现当级别达到WARNING后才会输出, 正如我们前面所说, 模块级别是四大组件的小扩展, 这个扩展就配置了日志级别是WARNING, 所以小于这个级别的debug和info就会被忽略
WARNING:root:warning
日志级别:日志器名称:日志内容
这也是小扩展里的BASIC_FORMAT的值设置为了
%(levelname)s:%(name)s:%(message)s
以上这些可以通过修改logging.basicConfig(**kwargs)
函数的参数
- filename 输出目标文件文件名, 指定后不会输出到控制台
- filemode 指定日志文件打开模式, 默认为'a', 添加模式, 且在filename指定后才生效
- format 格式
- datefmt 日期格式, format中包含时间字段(%(asctime)s)时生效
- level 日志级别
format:
-
%(asctime)s
人类可读时间 -
%(created)f
时间戳, 等同于time.time()
-
%(relativeCreated)d
日志发生的时间相对于logging模块加载时间的相对毫秒数 -
%(msecs)d
日志时间发生的毫秒部分 -
%(levelname)s
日志级别str格式 -
%(levelno)s
日志级别数字形式(10, 20, 30, 40, 50) -
%(name)s
日志器名称, 默认root -
%(message)s
日志内容 -
%(pathname)s
日志全路径 -
%(filename)s
文件名含后缀 -
%(module)s
文件名不含后缀 -
%(lineno)d
调用日志记录函数源代码的行号 -
%(funcName)s
调用日志记录函数的函数名 -
%(process)d
进程id -
%(processName)s
进程名称 -
%(thread)d
线程ID -
%(threadName)s
线程名称
import logging
# 日志格式
LOG_FORMAT="%(lineno)d - %(asctime)s - %(levelno)s - %(levelname)s - %(name)s - %(message)s - %(process)d - %(thread)d - %(module)s - %(funcName)s"
# 日期格式
DATE
logging.basicConfig(filename='my.log', level=logging.DEBUG, format=LOG_FORMAT)
logging.debug('debug log')
logging.warning('warning log')
# my.log
12 - 08/24/2018 19:42:24 PM - 10 - DEBUG - root - debug log - 13144 - 4464 - test - <module>
13 - 08/24/2018 19:42:24 PM - 30 - WARNING - root - warning log - 13144 - 4464 - test - <module>
可以修改每个占位格式的占位宽度:
%(lineno)-10d
, 占10个宽度; 其他修改类似
logging.basicConfig()
只在第一次调用时起作用, 后续再调用无效- 如果需要日志中包含变量, 可将格式字符串作为第一个参数
msg
的传入, 变量数据作为第二个参数*args
的传入, 如logging.warning('%s - %d', 'book', 10)
- 对于**kwargs, 支持三个关键字
exc_info
: 布尔类型, 默认False, 为True则将异常信息添加到日志, 没有异常添加None
stack_info
: 布尔类型, 默认False, 如为True, 栈信息将会被添加到日志
extra
: 字典参数, 可自定义消息格式所包含字段, 但键不能与logging模块定义字段冲突
import logging
FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}
logging.warning('Protocol problem: %s', 'connection reset', extra=d)
logging.error('error log', exc_info=True, stack_info=True, extra=d)
# my.log
2018-08-24 20:03:00,927 192.168.0.1 fbloggs Protocol problem: connection reset
2018-08-24 20:03:00,928 192.168.0.1 fbloggs error log
NoneType: None
Stack (most recent call last):
File "E:\1coding\temp\test\test.py", line 10, in <module>
logging.error('error log', exc_info=True, stack_info=True, extra=d)
给FORMAT添加了自定义字段, 就要在每个logging里都加上该字段对应的关键字参数, 否则报错
日志模块四大组件
- 日志器 Logger : 提供应用程序使用接口
- 处理器 Handler: 创建日志记录, 发送到合适目的地
- 过滤器 Filter: 对日志进行过滤存储
- 格式器 Formatter: 决定日志输出格式
logging模块就是通过这些组件处理日志
日志器(logger)可以通过一个或多个处理器(handler)将一条日志信息输出到不同的目标位置
并且每个处理器(handler)都可以设置自己的过滤器(fileter)和格式器(formatter)来决定日志输出内容
- Logger类
作用:
a. 设置日志等级
b. 提供写日志接口
c. 添加或移除处理器
d. 添加或移除过滤器
a> 设置等级:
Logger.setLevel(logging.级别)
- `Logger.setLevel(logging.ERROR)
b> 接口
Logger.级别()
- Logger.debug()
未完待续...