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 相关文章推荐
windows下wxPython开发环境安装与配置方法
Jun 28 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
Python实现的密码强度检测器示例
Aug 23 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
Python设计模式之代理模式实例详解
Jan 19 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
Apr 03 Python
Python3 pandas 操作列表实例详解
Sep 23 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
Jan 08 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 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 SOCKET编程详解
2015/05/22 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
JavaScript实现关键字高亮功能
2014/11/12 Javascript
从重置input file标签中看jQuery的 .val() 和 .attr(“value”) 区别
2016/06/12 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
2020/02/28 Javascript
Python基本数据类型详细介绍
2014/03/11 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
python绘制直线的方法
2018/06/30 Python
python使用matplotlib绘制热图
2018/11/07 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
Python3 合并二叉树的实现
2019/09/30 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
Python之Sklearn使用入门教程
2021/02/19 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
澳大利亚冒险体验:Adrenaline(跳伞、V8赛车、热气球等)
2017/09/18 全球购物
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
护理专业自荐信
2013/12/03 职场文书
2015高考寄语集锦
2015/02/27 职场文书
化妆品促销活动总结
2015/05/07 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
Redis性能监控的实现
2021/07/09 Redis
angular4实现带搜索的下拉框
2022/03/25 Javascript