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中使用元类的教程
Apr 28 Python
Python基础入门之seed()方法的使用
May 15 Python
Sanic框架流式传输操作示例
Jul 18 Python
Python matplotlib的使用并自定义colormap的方法
Dec 13 Python
python 输出所有大小写字母的方法
Jan 02 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Jul 11 Python
对Django中内置的User模型实例详解
Aug 16 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
Mar 06 Python
上帝为你开了一扇窗之Tkinter常用函数详解
Jun 02 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 Python
python 中的jieba分词库
Nov 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作为Shell脚本语言使用
2006/10/09 PHP
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
php中rename函数用法分析
2014/11/15 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
firefox插件Firebug的使用教程
2010/01/02 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
谈谈AngularJs中的隐藏和显示
2015/12/09 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
python实现博客文章爬虫示例
2014/02/26 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
Flask 让jsonify返回的json串支持中文显示的方法
2018/03/26 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
一套.net面试题及答案
2016/11/02 面试题
.NET程序员的几道面试题
2012/06/01 面试题
大学毕业登记表自我鉴定
2013/10/09 职场文书
小学学雷锋活动总结
2014/04/25 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers