python操作日志的封装方法(两种方法)


Posted in Python onMay 23, 2019

前言

今天就简单的对日志做个封装,实际工作中直接拿去用吧

方法1

"""
------------------------------------
@Time : 2019/5/22 8:12
@Auth : linux超
@File : logfile.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
------------------------------------
"""
import logging
class Log(object):
 def __init__(self, name=__name__, path='mylog.log', level='DEBUG'):
  self.__name = name
  self.__path = path
  self.__level = level
  self.__logger = logging.getLogger(self.__name)
  self.__logger.setLevel(self.__level)
 def __ini_handler(self):
  """初始化handler"""
  stream_handler = logging.StreamHandler()
  file_handler = logging.FileHandler(self.__path, encoding='utf-8')
  return stream_handler, file_handler
 def __set_handler(self, stream_handler, file_handler, level='DEBUG'):
  """设置handler级别并添加到logger收集器"""
  stream_handler.setLevel(level)
  file_handler.setLevel(level)
  self.__logger.addHandler(stream_handler)
  self.__logger.addHandler(file_handler)
 def __set_formatter(self, stream_handler, file_handler):
  """设置日志输出格式"""
  formatter = logging.Formatter('%(asctime)s-%(name)s-%(filename)s-[line:%(lineno)d]'
          '-%(levelname)s-[日志信息]: %(message)s',
          datefmt='%a, %d %b %Y %H:%M:%S')
  stream_handler.setFormatter(formatter)
  file_handler.setFormatter(formatter)
 def __close_handler(self, stream_handler, file_handler):
  """关闭handler"""
  stream_handler.close()
  file_handler.close()
 @property
 def Logger(self):
  """构造收集器,返回looger"""
  stream_handler, file_handler = self.__ini_handler()
  self.__set_handler(stream_handler, file_handler)
  self.__set_formatter(stream_handler, file_handler)
  self.__close_handler(stream_handler, file_handler)
  return self.__logger
if __name__ == '__main__':
 log = Log(__name__, 'file.log')
 logger = log.Logger
 logger.debug('I am a debug message')
 logger.info('I am a info message')
 logger.warning('I am a warning message')
 logger.error('I am a error message')
 logger.critical('I am a critical message')

初始化方法参数说明

name:自定义日志的名字, 默认是root, 但是我这里是使用调用文件的__name__ 作为默认名字

path:生成的日志的文件名

level:日志的级别,我这里把所有的级别都默认设置了level=DEBUG

方法2

使用logging.fileconfig这个模块实现(不知道这个模块的找度娘恶补一下把)

1.使用配置文件构造日志配置信息

logger.ini

[loggers]
keys = root, example01, example02
[logger_root]
level = DEBUG
handlers = hand01, hand02
[logger_example01]
handlers = hand01, hand02
qualname = example01
propagate = 0
[logger_example02]
handlers = hand01, hand03
qualname = example02
propagate = 0
[handlers]
keys = hand01, hand02, hand03
[handler_hand01]
class = StreamHandler
level = INFO
formatter = form01
args=(sys.stdout, )
[handler_hand02]
class = FileHandler
level = DEBUG
formatter = form01
args = ('log/test_case_log.log', 'a')
[handler_hand03]
class = handlers.RotatingFileHandler
level = INFO
formatter = form01
args = ('log/test_case_log.log', 'a', 10*1024*1024,3)
[formatters]
keys = form01, form02
[formatter_form01]
format = %(asctime)s-%(filename)s-[line:%(lineno)d]-%(levelname)s-[LogInfoMessage]: %(message)s
datefmt = %a, %d %b %Y %H:%M:%S
[formatter_form02]
format = %(name)-12s: %(levelname)-8s-[日志信息]: %(message)s
datefmt = %a, %d %b %Y %H:%M:%S

封装python代码

"""
------------------------------------
@Time : 2019/5/22 9:37
@Auth : linux超
@File : Log.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
------------------------------------
"""
import logging
from logging import config
class MyLog(object):
 def __init__(self):
  config.fileConfig('logger.ini')
  self.logger = logging.getLogger('example01')
 @property
 def my_logger(self):
  return self.logger
if __name__ == '__main__':
 log = MyLog()
 log.my_logger.info('it is my test log message info')

总结

两种方法各有好处吧

第一种代码很好理解思路清晰 , 但是不利于项目都维护,比如日志文件名,日志格式等无法修改,只能通过代码内部修改

第二种其实是使用config模块内部使用配置文件操作模块ConfigParser做了封装, 用配置文件来构造自定义日志器,好处很明显,我们只要通过修改配置文件就能修改日志的格式,名字,级别等等一些设置,无需改动代码,而且使用很简单, 其实这种方法完全不需要封装一个python代码,哪个模块需要输出日志,直接调用config模块获得logger就可以了(就是上面文件的那几行代码),今天就到这吧......

以上所述是小编给大家介绍的python操作日志的封装方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python 的内置字符串方法小结
Mar 15 Python
python 简单的绘图工具turtle使用详解
Jun 21 Python
python读取文本绘制动态速度曲线
Jun 21 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
python虚拟环境完美部署教程
Aug 06 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
利用python3 的pygame模块实现塔防游戏
Dec 30 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
May 26 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
Python读取多列数据以及用matplotlib制作图表方法实例
Sep 23 Python
Python除法之传统除法、Floor除法及真除法实例详解
May 23 #Python
详解Python3除法之真除法、截断除法和下取整对比
May 23 #Python
python实现远程控制电脑
May 23 #Python
python日志logging模块使用方法分析
May 23 #Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 #Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 #Python
Django框架登录加上验证码校验实现验证功能示例
May 23 #Python
You might like
php扩展ZF――Validate扩展
2008/01/10 PHP
php array的学习笔记
2012/05/10 PHP
php遍历文件夹和文件列表示例分享
2014/03/11 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
[05:06]DOTA2-DPC中国联赛 正赛 VG vs Magma选手采访
2021/03/11 DOTA
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
在python中实现强制关闭线程的示例
2019/01/22 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
2019/06/18 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
PyCharm+PyQt5+QtDesigner配置详解
2020/08/12 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
异步传递消息系统的作用
2016/05/01 面试题
什么样的创业计划书可行性高?
2014/02/01 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
党员剖析材料范文
2014/12/18 职场文书
感谢信范文大全
2015/01/23 职场文书