logging模块浅记
什么是日志
日志的作用
1.程序调试
2.了解软件程序运行情况,是否正常
3.软件程序运行故障分析与问题定位
日志的等级
- DEBUG
- INFO
- NOTICE
- WARNING
- ERROR
- CRITICAL
日志字段信息与日志格式
1.事件发生时间
2.事件发生位置
3.事件的严重程度--日志级别
4.事件内容
实现日志的库
第三方库:log4j,log4php.
标准库:logging
logging模块
日志级别
DEBUG
INFO
WARNING
ERROR
CRITICAL
日志级别在应用程序的配置中指定(一般);开发或测试部署使用DEBUG或INFO级别的日志获取尽可能详细地日志信息。
应用上线或部署生产环境时,可以私用warning或ERROR或CRITICAL级别来降低机器的I/O压力和提高获取错误日志信息的效率。
日志等级
当为某个应用程序指定一个日志级别后,应用程序会记录所有日志级别大于或等于日志级别的日志信息。
debug<INFO<WARNING<ERROR<CRITICAL
logging模块的使用方式
1.使用logging提供的模块级别函数(对日志系统相关类的封装)
logging.debug(msg,*args,**kwargs)
# debug可以替换成其他四种日志级别
## 有个例外的(Don"t know) ==>对root logger进行一次性配置
logging.basicConfig(**kwargs)
2.使用Logging日志系统的四大组件
loggers 提供应用程序代码直接使用的接口
handlers 用于将日志记录发生到指定的目的位置
filters 提供更细粒度的日志过滤功能
formatters 控制日志信息的最终输出格式
3.重要的自定义基础配置(不会配置)
logging.basicConfig(**kwargs)
fielname :指定日志输出文件名
filemode:指定日志文件的打开模式
format:指定日志格式字符串
datefm:只当日期/格式
level:日志器的日志级别
stream:指定日志输出目标stream(不理解)
4.logging模块定义的格式字符串字段
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 | 线程名称 |
5.补充说明
logging.basicConfig()函数是一个一次性的简单配置工具,只在第一次调用该函数时会起作用,后续再次调用就不起作用
日志器(Logger)是有层级关系的,上面调用的logging模块级别函数是RootLogger类的实例,其名称为'root',是处于日志器层级关系最顶级的日志器,且该实例是以单例模式存在的
使用指定字符串/变量格式化输出,将这些数据作为第二个参数*args的值传递
logging.warning('%s is %d years old.', 'Tom', 10)
第三个参数(可选)
logging.debug(), logging.info()等方法的定义中,除了msg和args参数外,还有一个**kwargs参数。它们支持3个关键字参数: exc_info, stack_info, extra,下面对这几个关键字参数作个说明。
关于exc_info, stack_info, extra关键词参数的说明:
exc_info: 其值为布尔值,如果该参数的值设置为True,则会将异常异常信息添加到日志消息中。如果没有异常信息则添加None到日志信息中。
stack_info: 其值也为布尔值,默认值为False。如果该参数的值设置为True,栈信息将会被添加到日志信息中。
extra: 这是一个字典(dict)参数,它可以用来自定义消息格式中所包含的字段,但是它的key不能与logging模块定义的字段冲突。
logging日志模块四大组件
日志器 Logger 提供了应用程序可一直使用的接口
处理器 Handler 将logger创建的日志记录发送到合适的目的地输出
Filter 过滤器
Formatter 决定日志记录的最终输出格式
组件之间的关系
日志器(logger)是入口,真正干活的是处理器(handler),处理器可以通过过滤器和格式器对要输出的日志内容做过滤和格式化操作
四大组件相关类
Logger
配置方法
.setLevel() 设置日志器将会处理的日志消息的最低严重级别
.addHandler()和Logger.removeHandler()为该logger对象添加和移出一个handler对象。
addFilter()和removeFilter() 为该logger对象添加和移出一个filter对象
创建日志记录
首先5大等级,创建与他们方法名对应等级的日志记录
logger.execption() 创建一个类似于Logger.error()的日志消息。
Logger.log() 需要获取一个明确的日志level参数来创建一个一个日志记录
创建logger对象
# 生成日志对象/或者可以通过logging类的实例化
logger = logging.getLogger()
filter类
并不知如何实现一个Filter类。
基本概念:它只允许某个logger层级下的日志事件通过过滤。
class logging.Filter(name='')
filter(record)