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中星号变量的几种特殊用法
Sep 07 Python
python读取excel表格生成erlang数据
Aug 26 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
Feb 18 Python
分析python请求数据
Aug 19 Python
详解django2中关于时间处理策略
Mar 06 Python
python程序变成软件的实操方法
Jun 24 Python
django组合搜索实现过程详解(附代码)
Aug 06 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
对python pandas中 inplace 参数的理解
Jun 27 Python
python函数超时自动退出的实操方法
Dec 28 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 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
swfupload 多文件上传实现代码
2008/08/27 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
php基于协程实现异步的方法分析
2019/07/17 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
Javascript 中的 && 和 || 使用小结
2010/04/25 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
详解webpack 多页面/入口支持&公共组件单独打包
2017/06/29 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
ES6 十大特性简介
2020/12/09 Javascript
Python3生成手写体数字方法
2018/01/30 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
对python Tkinter Text的用法详解
2018/10/11 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
如何通过python画loss曲线的方法
2019/06/26 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
智能旅行箱:Horizn Studios
2018/04/30 全球购物
C#公司笔试题
2014/03/28 面试题
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
2016党员党课心得体会
2016/01/07 职场文书
发工资啦!教你用Python实现邮箱自动群发工资条
2021/05/10 Python
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
使用CSS实现音波加载效果
2023/05/07 HTML / CSS