python3 logging日志封装实例


Posted in Python onApril 08, 2020

一个完整的程序离不开日志,无论是开发阶段,还是测试阶段,亦或程序运行阶段,都可以通过日志查看程序的运行情况,或是定位问题。

下面是对 python3 的日志库 logging 进行了封装,对于大部分的需求应该是能满足的。(如果有不满足的地方,欢迎在下方留言)

程序结构:

|--logger.py
|
|--singleton.py
|
|--demo.py
|
|--log
|  |
|  2018-10-12.log

logger.py

import os
import sys
import time
import logging
from singleton import Singleton
 
 
@Singleton   # 如需打印不同路径的日志(运行日志、审计日志),则不能使用单例模式(注释或删除此行)。此外,还需设定参数name。
class Logger:
  def __init__(self, set_level="INFO",
         name=os.path.split(os.path.splitext(sys.argv[0])[0])[-1],
         log_name=time.strftime("%Y-%m-%d.log", time.localtime()),
         log_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "log"),
         use_console=True):
    """
    :param set_level: 日志级别["NOTSET"|"DEBUG"|"INFO"|"WARNING"|"ERROR"|"CRITICAL"],默认为INFO
    :param name: 日志中打印的name,默认为运行程序的name
    :param log_name: 日志文件的名字,默认为当前时间(年-月-日.log)
    :param log_path: 日志文件夹的路径,默认为logger.py同级目录中的log文件夹
    :param use_console: 是否在控制台打印,默认为True
    """
    if not set_level:
      set_level = self._exec_type() # 设置set_level为None,自动获取当前运行模式
    self.__logger = logging.getLogger(name)
    self.setLevel(getattr(logging, set_level.upper()) if hasattr(logging, set_level.upper()) else logging.INFO) # 设置日志级别
    if not os.path.exists(log_path): # 创建日志目录
      os.makedirs(log_path)
    formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    handler_list = list()
    handler_list.append(logging.FileHandler(os.path.join(log_path, log_name), encoding="utf-8"))
    if use_console:
      handler_list.append(logging.StreamHandler())
    for handler in handler_list:
      handler.setFormatter(formatter)
      self.addHandler(handler)
 
  def __getattr__(self, item):
    return getattr(self.logger, item)
 
  @property
  def logger(self):
    return self.__logger
 
  @logger.setter
  def logger(self, func):
    self.__logger = func
 
  def _exec_type(self):
    return "DEBUG" if os.environ.get("IPYTHONENABLE") else "INFO"

singleton.py

class Singleton:
  """
  单例装饰器。
  """
  __cls = dict()
 
  def __init__(self, cls):
    self.__key = cls
 
  def __call__(self, *args, **kwargs):
    if self.__key not in self.cls:
      self[self.__key] = self.__key(*args, **kwargs)
    return self[self.__key]
 
  def __setitem__(self, key, value):
    self.cls[key] = value
 
  def __getitem__(self, item):
    return self.cls[item]
 
  @property
  def cls(self):
    return self.__cls
 
  @cls.setter
  def cls(self, cls):
    self.__cls = cls

demo.py

import logger
 
x = logger.Logger("debug")
 
x.critical("这是一个 critical 级别的问题!")
x.error("这是一个 error 级别的问题!")
x.warning("这是一个 warning 级别的问题!")
x.info("这是一个 info 级别的问题!")
x.debug("这是一个 debug 级别的问题!")
 
x.log(50, "这是一个 critical 级别的问题的另一种写法!")
x.log(40, "这是一个 error 级别的问题的另一种写法!")
x.log(30, "这是一个 warning 级别的问题的另一种写法!")
x.log(20, "这是一个 info 级别的问题的另一种写法!")
x.log(10, "这是一个 debug 级别的问题的另一种写法!")
 
x.log(51, "这是一个 Level 51 级别的问题!")
x.log(11, "这是一个 Level 11 级别的问题!")
x.log(9, "这条日志等级低于 debug,不会被打印")
x.log(0, "这条日志同样不会被打印")
 
 
"""
运行结果:
2018-10-12 00:18:06,562 - demo - CRITICAL - 这是一个 critical 级别的问题!
2018-10-12 00:18:06,562 - demo - ERROR - 这是一个 error 级别的问题!
2018-10-12 00:18:06,562 - demo - WARNING - 这是一个 warning 级别的问题!
2018-10-12 00:18:06,562 - demo - INFO - 这是一个 info 级别的问题!
2018-10-12 00:18:06,562 - demo - DEBUG - 这是一个 debug 级别的问题!
2018-10-12 00:18:06,562 - demo - CRITICAL - 这是一个 critical 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - ERROR - 这是一个 error 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - WARNING - 这是一个 warning 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - INFO - 这是一个 info 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - DEBUG - 这是一个 debug 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - Level 51 - 这是一个 Level 51 级别的问题!
2018-10-12 00:18:06,562 - demo - Level 11 - 这是一个 Level 11 级别的问题!
"""
2018-10-12.log

2018-10-12 00:18:06,562 - demo - CRITICAL - 这是一个 critical 级别的问题!
2018-10-12 00:18:06,562 - demo - ERROR - 这是一个 error 级别的问题!
2018-10-12 00:18:06,562 - demo - WARNING - 这是一个 warning 级别的问题!
2018-10-12 00:18:06,562 - demo - INFO - 这是一个 info 级别的问题!
2018-10-12 00:18:06,562 - demo - DEBUG - 这是一个 debug 级别的问题!
2018-10-12 00:18:06,562 - demo - CRITICAL - 这是一个 critical 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - ERROR - 这是一个 error 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - WARNING - 这是一个 warning 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - INFO - 这是一个 info 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - DEBUG - 这是一个 debug 级别的问题的另一种写法!
2018-10-12 00:18:06,562 - demo - Level 51 - 这是一个 Level 51 级别的问题!
2018-10-12 00:18:06,562 - demo - Level 11 - 这是一个 Level 11 级别的问题!

以上这篇python3 logging日志封装实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python根据路径导入模块的方法
Sep 30 Python
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
Python解析nginx日志文件
May 11 Python
Python中super关键字用法实例分析
May 28 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
python 遍历列表提取下标和值的实例
Dec 25 Python
python绘制多个子图的实例
Jul 07 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
如何基于Python批量下载音乐
Nov 11 Python
python3爬取torrent种子链接实例
Jan 16 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 #Python
Python 输出详细的异常信息(traceback)方式
Apr 08 #Python
python上传时包含boundary时的解决方法
Apr 08 #Python
python MultipartEncoder传输zip文件实例
Apr 07 #Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
Apr 07 #Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 #Python
Django Xadmin多对多字段过滤实例
Apr 07 #Python
You might like
php一个解析字符串排列数组的方法
2015/05/12 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
2008/03/22 Javascript
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
JS中操作JSON总结
2020/12/06 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
2017/08/14 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
webpack4.x CommonJS模块化浅析
2018/11/09 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
jQuery实现全选、反选和不选功能的方法详解
2019/12/04 jQuery
JS面向对象编程实现的Tab选项卡案例详解
2020/03/03 Javascript
JavaScript观察者模式原理与用法实例详解
2020/03/10 Javascript
解决python opencv无法显示图片的问题
2018/10/28 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
pytorch模型预测结果与ndarray互转方式
2020/01/15 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
Python多线程thread及模块使用实例
2020/04/28 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
Python wordcloud库安装方法总结
2020/12/31 Python
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
学生处主任岗位职责
2013/12/01 职场文书
文明礼仪事迹材料
2014/01/09 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
员工2014年度工作总结
2014/12/09 职场文书
2015年小班保育员工作总结
2015/05/27 职场文书