Python_logging模块
日志:方便用户了解系统、软件或应用的运行情况,及时发现问题并快速定位、解决问题。
一个日志信息对应的是一个事件的发生,而一个事件需要包括的几个内容:
- 事件发生时间
- 事件发生位置
- 事件发生严重程度(日志级别)
- 事件内容
还可以包括其他信息如:ID,进程名称,线程ID,线程名称等
logging模块日志等级(日志等级依次升高,日志信息量依次减少):
- DEBUG: 最详细的日志信息,典型应用场景为:问题诊断(开发应用程序或部署开发环境时)
- INFO:信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期那样的进行工作(开发应用程序或部署开发环境时)
- WARNING:当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低)此时应用程序在正常运行(应用上线或部署生产环境时)
- ERROR:由于发生一个更严重的问题导致某些功能不能正常运行时记录的信息(应用上线或部署生产环境时)
- CRITICAL:当发生严重错误,导致应用程序不能继续运行时记录的信息(应用上线或部署生产环境时)
注:logging模块中,程序指定一个日志级别后,应用程序只会记录并输出大于或者等于该指定日志级别的日志信息,小于该等级的日志记录将会被丢弃
1.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) | 对“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件打开模式”等信息进行一次性配置 |
注:日志记录函数只打印级别比日志器设置的级别高的日志记录,而比日志器设置的级别低的日志记录将会被丢弃
其中,logging.debug(),logging.info()等方法的定义中,**kwargs参数支持3个关键字参数
| exc_info: 布尔值,若为True,则会将异常信息添加到日志消息中,如果没有异常信息则添加None到日志信息中 | |
| stack_info: 布尔值, 默认为False,若为True,栈信息将会被添加到日志信息中 | |
| extra: 字典(dict)参数,用于自定义消息格式中所包含的字段,但它的key不能和logging模块定义的字段冲突 |
logging.basicConfig()函数
可接收的关键字参数:
| filename | 指定日志输出目标文件的文件名,指定该设置项后日志信息不会被输出到控制台 |
| filemode | 指定日志文件的打开模式,默认为“a”,注:只有filename指定时该选项才有效 |
| format | 指定日志输出时所包含的字段信息以及它们的顺序,即指定日志格式字符串 |
| datefmt | 指定日期/时间格式,注:只有format中包含时间字段%(asctime)时该选项才有效 |
| level | 指定日志器的日志级别 |
| stream | 指定日志输出目标流,如sys.stdout等,注:stream和filename不能同时提供,否则会报错 |
| style | 指定format格式字符串的风格,可取值为‘%’、‘{’和‘$’,默认为‘%’ |
| dandlers | 指定该选项,则创建多个Headler的可迭代对象,都将会被添加到根日志下,注:filename、stream和handlers只能存在一个 |
注:logging.basecConfig()只有第一次调用该函数才会起作用,
实例:
logging.basicConfig(filename='example.log', level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S') # basicConfig()对打印的日志信息进行一次性配置
logging.debug("debug ")
logging.info("info ")
logging.warning("waring ")
example
2018-10-13 17:22:52 info
2018-10-13 17:22:52 waring
result
2.logging模块相关类
1>.logger类:日志器,提供了应用程序可一直使用的接口
常用的配置方法:
| Logger.setLevel() | 设置日志器将会处理的日志消息的最低严重级别,小于设置的最低严重级别的级别消息将会被丢弃 |
| Logger.addHandler() 和 Logger.removeHandler() | 为该Logger对象添加 和 移除一个Handler对象 |
| Logger.addFilter() 和 Logger.removeFilter() | 为该Logger对象添加 和 移除一个Filter对象 |
配置完成后,创建日志记录的方法:
|
Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), Logger.critical() |
创建一个与它们的方法名对应级别的日志记录 |
| Logger.exception() | 创建一个类似与Logger.error()的日志消息,但它将会多输出堆栈追踪信息,通常只是在exception handler中调用该方法 |
| Logger.log() | 需要获取一个明确的日志level参数来创建一个日志记录 |
其中,logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则其值默认为root,若以相同的name参数多次调用getLogger方法,将会返回指向同一个logger对象的引用
2>.Handler类:处理器,将logger创建的日志记录发送到合适的目的输出
相关配置方法:(内建handler对象)
| Handler.setLevel() | 设置handler将会处理的日志消息的最低严重级别 |
| Handler.setFormatter() | 为handler设置一个格式器对象 |
| Handler.addFilter() 和 Handler.removeFilter() | 为handler添加 和 删除一个过滤器对象 |
常用的Handler接口:
| logging.StreamHandler | 将日志消息发送到输出到Stream(流),如std.out,std.err或任何file-like对象 |
| logging.FileHandler | 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 |
| logging.handlers.RotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按大小切割 |
| logging.handlers.HTTPHandler | 将日志消息以GET或POST的方式发送给一个HTTP服务器 |
| logging.handlers.SMTPHandler | 将日志消息发送给一个指定的email地址 |
| logging.NullHandler | 该Handler实例会忽略error messages通常被想使用logging的library开发者使用来避免“No handlers could be found for logger XXX”信息出现 |
3>.Filter类:过滤器,提供了更细粒度的控制工具来决定输出那一条日志记录,丢弃那一条日志记录
logging.Filter(name=‘ ’):若name的值为空字符串,则允许所有的日志事件通过过滤
filter(record):用于具体控制传递的record记录是否能通过过滤,返回值为0表示不能通过过滤,返回值非零表示可以通过过滤
注:在filter()方法内部改变record可以添加、删除或修改一些属性
4>.Formatter 类:格式器,决定日志记录的最终输出格式
Formatter类的构造方法:
logging.Formatter.__init__(fmt=None,datefmt=None,style="%")
- fmt: 指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
- datefmt:指定日期格式字符串,如果不指定该参数则默认使用“%Y-%m-%d %H: %M: %S”
- style:可取值为‘%’,‘{’和‘$’,如果不指定默认使用‘%’
实例:把日志同时打印到屏幕和文件里
import logging
logger = logging.getLogger('Test_log') # 生成logger对象
logger.setLevel(logging.DEBUG) # 这里的debug为全局的控制级别,优先级最高
ch = logging.StreamHandler() # 屏幕输出
ch.setLevel(logging.DEBUG) # 级别为debug,注释了也打印debug级别,因为全局的为debug
fh = logging.FileHandler('text.log') # 把日志写在文件里
fh.setLevel(logging.WARNING) # 级别为warning
formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s')
ch.setFormatter(formatter) # 把格式赋给屏幕
fh.setFormatter(formatter) # 把格式赋给文件
logger.addHandler(ch)
logger.addHandler(fh)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')
example
2018-10-13 17:41:14,159-Test_log-DEBUG-debug message
2018-10-13 17:41:14,159-Test_log-INFO-info message
2018-10-13 17:41:14,159-Test_log-WARNING-warn message
2018-10-13 17:41:14,159-Test_log-ERROR-error message
2018-10-13 17:41:14,159-Test_log-CRITICAL-critical message
屏幕结果
2018-10-13 17:41:40,072-Test_log-WARNING-warn message
2018-10-13 17:41:40,072-Test_log-ERROR-error message
2018-10-13 17:41:40,072-Test_log-CRITICAL-critical message
文件里结果
3.logging模块定义的字符串字段(在format格式字符串中的字段)
| 属性名 | 使用格式 | |
| asctime | %(asctime)s | 日志事件发生的时间,如:2018-10-13 17:46:45 |
| create | %(created)f | 日志事件发生的时间--时间戳 |
| relativeCreated | %(relativeCreated)d | 日志事件发生的时间相对与logging模块加载时间的相对毫秒数 |
| msecs | %(msecs)d | 日志事件发生时间的毫秒部分 |
| levelname | %(levelname)s | 该日志记录的文字形式的日子级别 |
| levelno | %(levelno)s | 该日志记录的数字形式 |
| name | %(name)s | 所使用的日志器名称,默认为root,因为默认使用的是rootLogger |
| message | %(message)s | 日志记录的文本内容(用户输出的消息),通过 msg%args 计算得到 |
| pathname | %(pathname)s | 调用日志输出函数(记录函数)的模块的完整路径名,可能没有 |
| filename | %(filename)s | 调用日志输出函数(记录函数)的模块的文件名,包含文件后缀 |
| module | %(module)s | 调用日志输出函数(记录函数)的模块名 |
| funcName | %(funcName)s | 调用日志输出函数(记录函数)的函数名 |
| lineno | %(lineno)s | 调用日志输出函数(记录函数)的语句所在的代码行号 |
| process | %(process)d | 进程ID |
| processName | %(processName)s | 进程名称,Python3.1新增 |
| thread | %(thread)d | 线程ID |
| threadName | %(thread)s | 线程名称 |
参考笔记:https://www.cnblogs.com/yyds/p/6901864.html
Python_logging模块的更多相关文章
- 【转载】python_logging模块
原文:https://www.cnblogs.com/liujiacai/p/7804848.html 1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志 ...
- npm 私有模块的管理使用
你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- ES6模块import细节
写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...
- Python标准模块--ContextManager
1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...
- Python标准模块--Unicode
1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...
- Python标准模块--Iterators和Generators
1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...
- 自己实现一个javascript事件模块
nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...
- 理解nodejs模块的scope
描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...
随机推荐
- new-delete-malloc-free关系总结
new-delete-malloc-free关系总结 写在前面的话 这个系列的笔记总结是根据网上的两篇基础拓展而来的 C++经典面试题(最全,面中率最高) C++面试集锦( 面试被问到的问题 ) 面试 ...
- $Django Rest Framework-频率组件,解析器
1 频率组件 #自定义组件写频率认证(重点继承BaseThrottle) from rest_framework.throttling import BaseThrottle import time ...
- 持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本
持续集成之⑤:jenkins结合脚本实现代码自动化部署及一键回滚至上一版本 一:本文通过jenkins调用shell脚本的的方式完成从Git服务器获取代码.打包.部署到web服务器.将web服务器从负 ...
- Jenkins pipeline概念理解
1.Jenkins Pipeline总体介绍 Pipeline,简而言之,就是一台运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程 ...
- springmvc框架原理分析和简单入门程序
一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...
- ios 清除缓存文件
获取缓存文件的大小 由于缓存文件存在沙箱中,我们可以通过NSFileManager API来实现对缓存文件大小的计算. 计算单个文件大小 +(float)fileSizeAtPath:(NSStrin ...
- WireShark Wifi认证数据包分析(论文idea)
1.使用 wireShark捕获802.11数据帧结构分成三种,管理帧.控制帧.数据帧. 使用的过滤语法: 过滤MAC 地址: Waln.bssid eq=8c:23:0c:44:21:0f 过滤特定 ...
- 小学生都看得懂的C语言入门(3): 数组与函数
#include <stdio.h> int main() { int x; ; ; scanf("%d",&x){ sum+=x; cnt++; scanf( ...
- CSS3媒体查询的部分重要属性
width:视口宽度 height:视口高度 device-width:渲染表面的宽度,就是设备屏幕的宽度 device-height:渲染表面的高度,就是设备屏幕的高度 orientation:检查 ...
- bzoj 4715
其实我并没有见过原题,只是因为...这被改编成了互测题... 题目中提到了一个序列,这个序列是很重要的,否则这个问题好像是没有合理的时间复杂度解法的 但正因为有了这个序列,这个问题的时间复杂度才让人能 ...