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正则表达式
Jan 15 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
关于Python数据结构中字典的心得
Dec 04 Python
Python中django学习心得
Dec 06 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
Jan 04 Python
flask session组件的使用示例
Dec 25 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
Python3.5常见内置方法参数用法实例详解
Apr 29 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
python 微信好友特征数据分析及可视化
Jan 07 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
Python restful框架接口开发实现
Apr 13 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操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
jQuery Mobile页面跳转后未加载外部JS原因分析及解决
2013/03/18 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
JavaScript立即执行函数的三种不同写法
2014/09/05 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
node.js实现登录注册页面
2017/04/08 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
JS实现图片切换特效
2019/12/23 Javascript
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python下Fabric的简单部署方法
2015/07/14 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
Python+Wordpress制作小说站
2017/04/14 Python
django输出html内容的实例
2018/05/27 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
python连接PostgreSQL数据库的过程详解
2019/09/18 Python
pip 安装库比较慢的解决方法(国内镜像)
2019/10/06 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
人力资源主管的岗位职责
2014/03/15 职场文书
护士个人自我鉴定
2014/03/24 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android