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语言编写电脑时间自动同步小工具
Mar 08 Python
Python中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
python交互式图形编程实例(三)
Nov 17 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
Python 多维List创建的问题小结
Jan 18 Python
Python字符串的一些操作方法总结
Jun 10 Python
python实现logistic分类算法代码
Feb 28 Python
Python selenium文件上传下载功能代码实例
Apr 13 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
python实现图片九宫格分割的示例
Apr 25 Python
python之np.argmax()及对axis=0或者1的理解
Jun 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
php自动跳转中英文页面
2008/07/29 PHP
zend api扩展的php对象的autoload工具
2011/04/18 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
浅析Python多线程下的变量问题
2015/04/28 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
python清理子进程机制剖析
2017/11/23 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
python之array赋值技巧分享
2019/11/28 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
python剪切视频与合并视频的实现
2020/03/03 Python
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
mysql有关权限的表都有哪几个
2015/04/22 面试题
信息管理员岗位职责
2013/12/01 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
护理目标管理责任书
2014/07/25 职场文书
四风对照检查材料范文
2014/09/27 职场文书
员工安全责任协议书
2016/03/22 职场文书
画错魏国疆域啦!《派对咖孔明》动画因作画失误于官网致歉
2022/04/07 日漫