Python logging模块进行封装实现原理解析


Posted in Python onAugust 07, 2020

1. 简介

      追踪某些软件运行时所发生事件的方法, 可以在代码中调用日志中某些方法来记录发生的事情

一个事件可以用一个可包含可选变量数据的消息来描述

事件有自己的重要性等级

2. 使用logging日志系统四大组件

  • loggers日志器
    • 提供应用程序代码直接使用的接口
  • handlers处理器
    • 用于将日志记录发送到指定的目的位置
  • filters过滤器
    • 过滤, 决定哪些输出哪些日志记录, 其余忽略
  • formatters格式器
    • 控制日志输出格式

使用代码如下

import os, time, logging, sys
from Common.plugs.get_config import r_config

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
if sys.platform == "win32":
  ENV_CONF_DIR = os.path.join(BASE_DIR, 'Common/conf/env_config.ini').replace('/', '\\')
else:
  ENV_CONF_DIR = os.path.join(BASE_DIR, 'Common/conf/env_config.ini')
log_path = r_config(ENV_CONF_DIR, "log", "log_path")


class Log:

  def __init__(self, log_path):
    self.logName = os.path.join(log_path, '{0}.log'.format(time.strftime('%Y-%m-%d')))

  def console_log(self, level, message):
    # 创建一个logger
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

    # 创建一个handler,用于 debug 写入日志文件
    debug_file = logging.FileHandler(self.logName, 'a+', encoding='utf-8')
    debug_file.setLevel(logging.DEBUG)

    # 再创建一个handler,用于输出到控制台
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)

    # 定义handler的输出格式

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    debug_file.setFormatter(formatter)
    ch.setFormatter(formatter)

    # 给logger添加handler
    logger.addHandler(debug_file)
    logger.addHandler(ch)

    # 记录一条日志
    if level == 'info':
      logger.info(message)
    elif level == 'debug':
      logger.debug(message)
    elif level == 'warning':
      logger.warning(message)
    elif level == 'error':
      logger.error(message)

    elif level == 'critical':
      logger.critical(message)

    logger.removeHandler(ch)
    logger.removeHandler(debug_file)
    debug_file.close()

  def debug(self, message): #最详细日志信息, 多用于问题诊断
    self.console_log('debug', message)

  def info(self, message): #仅次于DEBUG, 多用于记录关键点信息, 确保程序按预期执行
    self.console_log('info', message)

  def warning(self, message): #低等级故障, 但程序仍能运行, 如磁盘空间不足警告
    self.console_log('warning', message)

  def error(self, message): #由于比WARNING严重的问题, 导致某些功能不能正常运行时的记录
    self.console_log('error', message)

  def critical(self, message): 严重错误, 导致应用程序不能继续运行时的记录
    self.console_log('critical', message)


if __name__ == '__main__':
  Log(log_path).info("adasd")
  Log(log_path).error("dsadasddasd")
'''

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
wxPython学习之主框架实例
Sep 28 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
Python列表生成式与生成器操作示例
Aug 01 Python
python微元法计算函数曲线长度的方法
Nov 08 Python
python验证身份证信息实例代码
May 06 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python__name__原理及用法详解
Nov 02 Python
django实现类似触发器的功能
Nov 15 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
python将四元数变换为旋转矩阵的实例
Dec 04 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
Python定时任务APScheduler安装及使用解析
Aug 07 #Python
Python如何解除一个装饰器
Aug 07 #Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
Aug 07 #Python
Python实现上下文管理器的方法
Aug 07 #Python
Python 读取位于包中的数据文件
Aug 07 #Python
Python如何绘制日历图和热力图
Aug 07 #Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
Aug 07 #Python
You might like
又一个php 分页类实现代码
2009/12/03 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
vue组件name的作用小结
2018/05/23 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
vue操作下拉选择器获取选择的数据的id方法
2018/08/24 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
在Python中定义一个常量的方法
2018/11/10 Python
Python日期时间Time模块实例详解
2019/04/15 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
机电专业个人求职信范文
2013/12/30 职场文书
最新的互联网创业计划书
2014/01/10 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
普宁寺导游词
2015/02/04 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python
Golang ort 中的sortInts 方法
2022/04/24 Golang
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android