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 while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
python正则表达式之作业计算器
Mar 18 Python
详谈Python基础之内置函数和递归
Jun 21 Python
开源软件包和环境管理系统Anaconda的安装使用
Sep 04 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
python3正则提取字符串里的中文实例
Jan 31 Python
python将字符串list写入excel和txt的实例
Jul 20 Python
django框架中间件原理与用法详解
Dec 10 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
手把手教你怎么用Python实现zip文件密码的破解
May 27 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 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
全文搜索和替换
2006/10/09 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
php输入数据统一类实例
2015/02/23 PHP
php通过curl模拟登陆DZ论坛
2015/05/11 PHP
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
详细介绍8款超实用JavaScript框架
2013/10/25 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
JavaScript获取网页表单提交方式的方法
2015/04/02 Javascript
JS实现对中文字符串进行utf-8的Base64编码的方法(使其与Java编码相同)
2016/06/21 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
JavaScript正则表达式验证登录实例
2020/03/18 Javascript
python使用json序列化datetime类型实例解析
2018/02/11 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
详解Python3注释知识点
2019/02/19 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
python如何删除列为空的行
2020/07/17 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
青年文明号事迹材料
2014/01/18 职场文书
装修设计师求职信
2014/02/26 职场文书
入党群众意见范文
2015/06/02 职场文书
Consul在linux环境的集群部署
2022/04/08 Servers
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android