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实现网站文件的全备份和差异备份
Nov 30 Python
python实现数独算法实例
Jun 09 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
Mar 21 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
Python实现自动为照片添加日期并分类的方法
Sep 30 Python
详解Django 中是否使用时区的区别
Jun 14 Python
Python SVM(支持向量机)实现方法完整示例
Jun 19 Python
python K近邻算法的kd树实现
Sep 06 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 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
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
2014/04/09 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
js中字符替换函数String.replace()使用技巧
2011/08/14 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python fabric使用笔记
2015/05/09 Python
Python实现图像几何变换
2015/07/06 Python
Python中基本的日期时间处理的学习教程
2015/10/16 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
美国网上购买眼镜:Eyeconic
2017/07/29 全球购物
中东奢侈品市场:Coveti
2019/05/12 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
王力宏牛津大学演讲稿
2014/05/22 职场文书
乡镇党建工作汇报材料
2014/10/27 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
趣味运动会赞词
2015/07/22 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js