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的Flask框架的简介和安装方法
Nov 13 Python
python生成验证码图片代码分享
Jan 28 Python
深入学习Python中的装饰器使用
Jun 20 Python
深入解析Python的Tornado框架中内置的模板引擎
Jul 11 Python
Python实现翻转数组功能示例
Jan 12 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
python sklearn库实现简单逻辑回归的实例代码
Jul 01 Python
Python 爬取必应壁纸的实例讲解
Feb 24 Python
python接口自动化框架实战
Dec 23 Python
python 对xml解析的示例
Feb 27 Python
python通配符之glob模块的使用详解
Apr 24 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
php中spl_autoload详解
2014/10/17 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
浅析php原型模式
2014/11/25 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
php去掉文件前几行的方法
2015/07/29 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
jQuery取id有.的值的方法
2014/05/21 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
canvas绘图不清晰的解决方案
2017/02/28 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
python数据结构之链表详解
2017/09/12 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
应届毕业生求职信范例分享
2013/12/17 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
小学生成长感言
2014/01/30 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
MBA推荐信怎么写
2015/03/25 职场文书
监理中标通知书
2015/04/16 职场文书
董事长秘书工作总结
2015/08/14 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
python随机打印成绩排名表
2021/06/23 Python
详解OpenCV曝光融合
2022/04/29 Python
PYTHON InceptionV3模型的复现详解
2022/05/06 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS