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 23 Python
python计算N天之后日期的方法
Mar 31 Python
Python三级菜单的实例
Sep 13 Python
python实现飞机大战
Sep 11 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
使用python实现unix2dos和dos2unix命令的例子
Aug 13 Python
Python模块相关知识点小结
Mar 09 Python
python实现批量修改文件名
Mar 23 Python
Python接收手机短信的代码整理
Aug 02 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 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将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
php设计模式之单例模式代码
2016/06/11 PHP
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
javaScript实现复选框全选反选事件详解
2020/11/20 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
python正则表达式爬取猫眼电影top100
2018/02/24 Python
详解python分布式进程
2018/10/08 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
python实现列表中最大最小值输出的示例
2019/07/09 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
Python自省及反射原理实例详解
2020/07/06 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
教师实习自我鉴定
2013/12/11 职场文书
员工培训心得体会
2013/12/30 职场文书
大学生村官任职感言
2014/01/09 职场文书
会计岗位职责范本
2014/03/07 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
学校运动会广播稿100条
2014/09/14 职场文书