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实现监控windows服务并自动启动服务示例
Apr 17 Python
python实现模拟按键,自动翻页看u17漫画
Mar 17 Python
Python smallseg分词用法实例分析
May 28 Python
解密Python中的描述符(descriptor)
Jun 03 Python
Python实现线程状态监测简单示例
Mar 28 Python
Python实现一个服务器监听多个客户端请求
Apr 12 Python
python中验证码连通域分割的方法详解
Jun 04 Python
Python3中详解fabfile的编写
Jun 24 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
在交互式环境中执行Python程序过程详解
Jul 12 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 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中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
表单提交时自动复制内容到剪贴板的js代码
2007/03/16 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
在Vue 中实现循环渲染多个相同echarts图表
2020/07/20 Javascript
centos 下面安装python2.7 +pip +mysqld
2014/11/18 Python
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
python基础教程之匿名函数lambda
2017/01/17 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
Python自定义一个类实现字典dict功能的方法
2019/01/19 Python
Python面向对象程序设计示例小结
2019/01/30 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
20行python代码实现人脸识别
2019/05/05 Python
Python 使用matplotlib模块模拟掷骰子
2019/08/08 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
django创建css文件夹的具体方法
2020/07/31 Python
爱游人:Travelliker
2017/09/05 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
关于感恩的演讲稿500字
2014/08/26 职场文书
追讨欠款律师函
2015/05/27 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
SQL优化老出错,那是你没弄明白MySQL解释计划用法
2021/11/27 MySQL