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 27 Python
Python中super关键字用法实例分析
May 28 Python
使用Python读写文本文件及编写简单的文本编辑器
Mar 11 Python
python使用matplotlib绘制柱状图教程
Feb 08 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
Python基础之文件读取的讲解
Feb 16 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
Python定时任务随机时间执行的实现方法
Aug 14 Python
Python面向对象原理与基础语法详解
Jan 02 Python
python实现简单井字棋游戏
Mar 04 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 归并排序 数组交集
2011/05/10 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
第五章 php数组操作
2011/12/30 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
你可能不再需要JQUERY
2021/03/09 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
JS使用for in有序获取对象数据
2020/05/19 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
python实现合并两个数组的方法
2015/05/16 Python
深入理解Django的自定义过滤器
2017/10/17 Python
Python 面试中 8 个必考问题
2018/11/16 Python
Pycharm配置远程调试的方法步骤
2018/12/17 Python
基于python实现把图片转换成素描
2019/11/13 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
化学系大学生自荐信范文
2014/03/01 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
总结一些Java常用的加密算法
2021/06/11 Java/Android
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android