Logging 框架:
名称 | 属性 | 备注 |
Logger | 生成器 | 即Logger Main Class,是我们进行日志记录时创建的对象,我们可以调用它的方法传入日志模板和信息,来生成一条条日志记录,称作Log Record。 |
Log Record | 日志记录 | 就代指生成一条条日志记录 |
Handler | 处理器 | 即用来处理日志记录的类,它可以将Log Record 输出到我们指定的日志位置和存储形式等,如我们可以指定将日志通过FTP协议记录到远程的服务器上,Handler就会帮我们完成这些事。 |
Formatter | 格式化处理器 | 实际上生成的Log Rceord 也是一个个对象,那么我们想要把它们保存成一条条我们想要的日志文本的话,就需要有一个格式化的过程,那么这个过程就由Formatter来完成,返回的就是日志字符串, 然后传回给Handler处理。 |
Filter | 过滤器 | 另外保存日志的时候我们可能不需要全部保存,我们可能只需要保存我们想要的部分就可以了,所以保存前还需要进行一下过滤,留下我们想要的日志,如只保存某个级别的日志,或只保存包含某个关键字的日志等,那么这个过程就交给Filter来完成。 |
Parent Handler | 父级处理器 | Handler 之间可以存在分层关系, 以使得不同Handler之间共享相同功能的代码。 |
一条日志信息对应的是一个事件的发生,而一个事件通常需要包括以下几个内容:
1,事件发生时间
2,事件发生位置
3,事件的严重程度——日志级别
4,事件内容
Logging 实例:
import logging #引入logging 模块 logging.basicConfig( #通过basicConfig设置基本配置 level=logging.INFO, # level 配置 Info 级别 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') #输出Info级别信息format格式的字符串 # 四个内容分别代表 时间、模块名称、日志级别、日志内容 logger = logging.getLogger(__name__) #声明 一个Logging对象 括号内的是 name 的值 logger.info('This is a log info') #括号内的是 message 的 值 logger.debug('Debugging') logger.warning('Warning exists') logger.info('Finish')
输出结果:
2018-10-18 21:04:14,954 - __main__ - INFO - This is a log info 2018-10-18 21:04:14,954 - __main__ - WARNING - Warning exists 2018-10-18 21:04:14,954 - __main__ - INFO - Finish
ps:因为我们在全局配置的时候设置了输出为Info 级别,所以Debug 级别的信息就被过滤掉了。
Level 级别:
等级 | 数值 | 属性 |
Notset | 0 | 不设置 |
Debug | 10 | 调式信息 |
Info | 20 | 常规信息 |
Warning | 30 | 警告信息 |
Warn | 30 | 警告信息 |
Error | 40 | 错误信息 |
Fatal | 50 | 严重错误 |
Critical | 50 | 毁灭错误 |
BasiConfig的参数:
名称 | 属性 |
filename | 即日志输出的文件名 |
filemode | 指定日志文件的写入方式,(两种形式 w a ) |
format | 指定 日志信息的输出格式 |
datefmt | 指定时间的输出格式 |
style | 如果format参数指定了,这个参数就可以指定格式化时的占位符风格,如%、{、$等。 |
level | 指定日志输出的类别,程序会输出大于此级别的信息 |
stream | 在没有指定filename的时候会默认使用SteamHandler,这时stream可以指定初始化的文件流 |
handlers | 可以指定日志处理时所使用的Handlers,必须时可迭代的 |
foumat的部分参数如下:
%(levelname)s | 打印日志级别的名称 |
%(asctime)s | 打印日志的时间 |
%(module)s | 打印模块名称 |
%(message)s | 打印日志信息 |
%(funcName)s | 打印日志的时间 |
%(lineno)s | 打印日志的当前行号 |
%(levelno)s | 打印日志级别的数值 |
%(pathname)s | 打印当前程序的路径,其实就是sys.argv[0]. |
%(filename)s | 打印当前执行程序名 |
%(thread)s | 打印线程ID |
%(threadName)s | 打印线程名称 |
%(process)s | 打印进程ID |
%(prcessName) | 打印进程名称 |
ps:黑体加黑 常用
实例如下:
import logging logging.basicConfig(level=logging.DEBUG, filename='output.log', datefmt='%Y/%m/%d %H:%M:%S', format='%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(module)s - %(message)s') logger = logging.getLogger(__name__) logger.info('This is a log info') logger.debug('Debugging') logger.warning('Warning exists') logger.info('Finish')
输出结果为:
2018/10/18 21:35:19 - __main__ - INFO - 79 - 模块 - This is a log info 2018/10/18 21:35:19 - __main__ - DEBUG - 80 - 模块 - Debugging 2018/10/18 21:35:19 - __main__ - WARNING - 81 - 模块 - Warning exists 2018/10/18 21:35:19 - __main__ - INFO - 82 - 模块 - Finish
logging 模块的 Formatter,Handler,Logger,Filter 对象
#logger:产生日志的对象
#Filter:过滤日志的对象
#Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端
#Formatter对象:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式