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 相关文章推荐
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
Jan 24 Python
python绘制圆柱体的方法
Jul 02 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
情人节快乐! python绘制漂亮玫瑰
Aug 18 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
python文件转为exe文件的方法及用法详解
Jul 08 Python
python实现双色球随机选号
Jan 01 Python
tf.concat中axis的含义与使用详解
Feb 07 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 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
全国中波电台频率表
2020/03/11 无线电
教你如何把一篇文章按要求分段
2006/10/09 PHP
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
Json实现异步请求提交评论无需跳转其他页面
2014/10/11 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
Python中几个比较常见的名词解释
2015/07/04 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
python3 pygame实现接小球游戏
2019/05/14 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
Python3批量创建Crowd用户并分配组
2020/05/20 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
说一下Linux下有关用户和组管理的命令
2016/01/04 面试题
自荐书封面下载
2013/11/29 职场文书
金融行业职业生涯规划范文
2014/01/17 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
在职证明书模板
2015/06/15 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
vue ref如何获取子组件属性值
2022/03/31 Vue.js