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算法学习之桶排序算法实例(分块排序)
Dec 18 Python
python实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
python列表操作之extend和append的区别实例分析
Jul 28 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
Python3 单行多行万能正则匹配方法
Jan 07 Python
Python如何使用turtle库绘制图形
Feb 26 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
pytorch简介
Nov 11 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遍历数组的几种方法
2012/03/22 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
2012/07/21 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
详谈js遍历集合(Array,Map,Set)
2017/04/06 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
浅谈python中的占位符
2017/11/09 Python
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
Python使用functools实现注解同步方法
2018/02/06 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
弘扬雷锋精神演讲稿
2014/05/10 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
法制教育观后感
2015/06/17 职场文书
人事任命书范本
2015/09/21 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
古诗之感恩老师
2019/10/24 职场文书