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 Django做网页
Nov 04 Python
pyqt和pyside开发图形化界面
Jan 22 Python
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
python SSH模块登录,远程机执行shell命令实例解析
Jan 12 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
Python多线程处理实例详解【单进程/多进程】
Jan 30 Python
Python操作SQLite数据库过程解析
Sep 02 Python
numpy.array 操作使用简单总结
Nov 08 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
Python 操作SQLite数据库的示例
Oct 16 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面向对象编程快速入门
2006/10/09 PHP
PHP递归复制、移动目录的自定义函数分享
2014/11/18 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
实用框架(iframe)操作代码
2014/10/23 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
2020/06/01 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
[00:55]2015国际邀请赛中国区预选赛5月23日——28日约战上海
2015/05/25 DOTA
python动态参数用法实例分析
2015/05/25 Python
详解C++编程中一元运算符的重载
2016/01/19 Python
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
python实现学生信息管理系统
2020/04/05 Python
解决python删除文件的权限错误问题
2018/04/24 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
浅谈Python中的模块
2020/06/10 Python
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
三星美国官网:Samsung美国
2017/02/06 全球购物
智能旅行箱:Horizn Studios
2018/04/30 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
法学专业个人求职信
2013/09/26 职场文书
运动会通讯稿50字
2014/01/30 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
预备党员的自我评价
2014/03/12 职场文书
活动总结书
2014/05/08 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL