Python logging模块原理解析及应用


Posted in Python onAugust 13, 2020

一、logging日志模块等级

常见log级别从高到低:

CRITICAL 》ERROR 》WARNING 》INFO 》DEBUG,默认等级为WARNING,即>=WARNING级别的log才输出。

日志等级(level) 描述
CRITICAL 当发生严重错误,导致应用程序不能继续运行时记录的信息
ERROR 由于一个更严重的问题导致某些功能不能正常运行时记录的信息
WARNING 当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
INFO 信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
DEBUG 最详细的日志信息,典型应用场景是 问题诊断

二、logging模块的使用方式介绍

logging模块提供了两种记录日志的方式:

  • 第一种方式是使用logging提供的模块级别的函数
  • 第二种方式是使用Logging日志系统的四大组件

其实,logging所提供的模块级别的日志记录函数也是对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) 对root logger进行一次性配置

其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。

(2)logging模块的四大组件

组件 说明
loggers 提供应用程序代码直接使用的接口
handlers 用于将日志记录发送到指定的目的位置
filters 提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略)
formatters 用于控制日志信息的最终输出格式

三、自定义Logger模块类

# testLog1.py

import logging
import time

class Logger():

  def __init__(self, logger, level=logging.DEBUG):
    '''
 : 自定义Logger模块类
    : logger: logger名
    : level: 日志级别
    '''

    # 创建一个logger
    self.logger = logging.getLogger(logger)
    self.logger.setLevel(level)

    # 定义handler的输出格式
    curr_time = time.strftime("%Y-%m-%d")
    self.LogFileName = 'log' + curr_time + '.txt'
    fmt = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s')

    # asctime: 日志事件发生的时间
    # filename: 源文件的名称部分,包含文件后缀
    # lineno: 调用日志记录函数的源代码所在的行号
    # evelname: 该日志记录的文字形式的日志级别
    # message: 日志记录的文本内容

    # 创建一个handler, 用于写入日志文件
    fh = logging.FileHandler(self.LogFileName)
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(fmt)

    # 再创建一个handler,用于输出到控制台
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    ch.setFormatter(fmt)

    # 给logger添加handler
    self.logger.addHandler(fh)
    self.logger.addHandler(ch)

    # level优先级
    # logger.setLevel > handler.setLevel > logging.basicConfig

if __name__ == "__main__":
  log = Logger(__name__, level=logging.DEBUG)
  log.logger.debug('debug')
  log.logger.log(logging.DEBUG, 'debug')# 执行testLog1.py,则控制台输出如下:2020-08-03 20:36:47,104 - testLog1.py:[117] - [DEBUG] - debug2020-08-03 20:36:47,104 - testLog1.py:[118] - [DEBUG] - debug# 日志文件记录如下:2020-08-03 20:36:15,982 - testLog1.py:[117] - [DEBUG] - debug2020-08-03 20:36:15,982 - testLog1.py:[118] - [DEBUG] - debug
# testLog2.py

from testLog1 import Logger
import traceback

log = Logger(__name__)
def func():
  try:
    assert 1==2
  except Exception:
    log.logger.info('测试失败,输出信息如下:{}'.format(traceback.format_exc()))
# traceback.format_exc() 会返回异常信息的字符串

if __name__ == "__main__":
  func()# 执行testLog2.py,则控制台输出如下:2020-08-03 20:43:44,907 - testLog2.py:[11] - [INFO] - 测试失败,输出信息如下:Traceback (most recent call last):  File "E:/imooc/testLog.py", line 9, in func    assert 1==2AssertionError# 日志文件记录如下:2020-08-03 20:43:44,907 - testLog2.py:[11] - [INFO] - 测试失败,输出信息如下:Traceback (most recent call last):  File "E:/imooc/testLog.py", line 9, in func    assert 1==2AssertionError

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
Python 字典与字符串的互转实例
Jan 13 Python
深入理解Python对Json的解析
Feb 14 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
python实现京东订单推送到测试环境,提供便利操作示例
Aug 09 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
python selenium xpath定位操作
Sep 01 Python
教你用Python+selenium搭建自动化测试环境
Jun 18 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 #Python
使用jupyter notebook运行python和R的步骤
Aug 13 #Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 #Python
Python如何读写CSV文件
Aug 13 #Python
区分python中的进程与线程
Aug 13 #Python
python判断一个变量是否已经设置的方法
Aug 13 #Python
vscode+PyQt5安装详解步骤
Aug 12 #Python
You might like
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
微信公众号开发之文本消息自动回复php代码
2016/08/08 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
php语法检查的方法总结
2019/01/21 PHP
extjs 学习笔记(三) 最基本的grid
2009/10/15 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
使用AngularJS实现表单向导的方法
2015/06/19 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
Vue中使用webpack别名的方法实例详解
2018/06/19 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
2020/08/03 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python统计列表中的重复项出现的次数的方法
2014/08/18 Python
python银行系统实现源码
2019/10/25 Python
使用python-pptx包批量修改ppt格式的实现
2020/02/14 Python
Python class的继承方法代码实例
2020/02/14 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
婚礼新郎父母答谢词
2014/01/16 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
黄埔军校观后感
2015/06/10 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
导游词之麻姑仙境
2019/11/18 职场文书
深入解析MySQL索引数据结构
2021/10/16 MySQL