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创建XML文档
Mar 01 Python
linux 下实现python多版本安装实践
Nov 18 Python
用Python实现KNN分类算法
Dec 22 Python
Flask框架配置与调试操作示例
Jul 23 Python
Python3随机漫步生成数据并绘制
Aug 27 Python
python发送告警邮件脚本
Sep 17 Python
python多进程控制学习小结
Oct 31 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
Python元组常见操作示例
Feb 19 Python
python增加图像对比度的方法
Jul 12 Python
PyCharm GUI界面开发和exe文件生成的实现
Mar 04 Python
Python多线程thread及模块使用实例
Apr 28 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代码
2008/04/09 PHP
PHP微信开发用Cache 解决数据缓存
2016/07/11 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
php设计模式之适配器模式原理、用法及注意事项详解
2019/09/24 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
2016/04/26 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
javascript运行机制之执行顺序理解
2020/08/03 Javascript
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
在Python中使用列表生成式的教程
2015/04/27 Python
python实现泊松图像融合
2018/07/26 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
浅谈Python中的模块
2020/06/10 Python
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
高中语文教学反思
2014/01/16 职场文书
幼教简历自我评价
2014/01/28 职场文书
学生请假条
2014/04/11 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
社会实践活动总结范文
2014/07/03 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
学前班语言教学计划
2015/01/20 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技
Python函数对象与闭包函数
2022/04/13 Python
MySQL存储过程及语法详解
2022/08/05 MySQL