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

前言

曾经转载过一篇关于python日志模块logging的详解 https://www.cnblogs.com/linuxchao/p/linuxchao-log.html, 虽然这篇文章是别人写的, 但是我就是靠着这篇文章入门的logging,所以我觉得没必要再继续说些理论的东西,今天就简单的对日志做个封装,实际工作中直接拿去用吧

方法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操作日志的封装方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Python3实现的Mysql数据库操作封装类

    本文实例讲述了Python3实现的Mysql数据库操作封装类.分享给大家供大家参考,具体如下: #encoding:utf-8 #name:mod_db.py ''''' 使用方法:1.在主程序中先实例化DB Mysql数据库操作类. 2.使用方法:db=database() db.fetch_all("sql") ''' import MySQLdb import MySQLdb.cursors import mod_config import mod_logger DB = &qu

  • 基于python3 类的属性、方法、封装、继承实例讲解

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. python类与c++类相似,提供了类的封装,继承.多继承,构造函数.析构函数. 在python3中,所有类最顶层父类都是object类,与java类似,如果定义类的时候没有写出父类,则object类就是其直接父类. 类定义 类定义语法格式如下: class ClassName: <statement

  • Python操作Oracle数据库的简单方法和封装类实例

    本文实例讲述了Python操作Oracle数据库的简单方法和封装类.分享给大家供大家参考,具体如下: 最近工作有接触到Oracle,发现很多地方用Python脚本去做的话,应该会方便很多,所以就想先学习下Python操作Oracle的基本方法. 考虑到Oracle的使用还有一个OracleClient的NetConfig的存在,我觉得连接起来就应该不是个简单的事情. 果然,网上找了几个连接方法,然后依葫芦却画了半天,却也不得一个瓢. 方法1:用户名,密码和监听分别作为参数 conn=cx_Ora

  • python操作ssh实现服务器日志下载的方法

    本文实例讲述了python操作ssh实现服务器日志下载的方法.分享给大家供大家参考.具体实现方法如下: #coding:utf-8 """ ssh操作例子 实现了服务器日志下载 2012-08-24 yywolf """ import paramiko import time hostname="????" port=22 username="app" password="????" i

  • Python数据操作方法封装类实例

    本文实例讲述了Python数据操作方法封装类.分享给大家供大家参考,具体如下: 工作中经常会用到数据的插叙.单条数据插入和批量数据插入,以下是本人封装的一个类,推荐给各位: #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Eric.yue import logging import MySQLdb class _MySQL(object): def __init__(self,host, port, user, passwd, db):

  • Python中使用asyncio 封装文件读写

    前言 和网络 IO 一样,文件读写同样是一个费事的操作. 默认情况下,Python 使用的是系统的阻塞读写.这意味着在 asyncio 中如果调用了 f = file('xx') f.read() 会阻塞事件循环. 本篇简述如何用 asyncio.Future 对象来封装文件的异步读写. 代码在 GitHub.目前仅支持 Linux. 阻塞和非阻塞 首先需要将文件的读写改为非阻塞的形式.在非阻塞情况下,每次调用 read 都会立即返回,如果返回值为空,则意味着文件操作还未完成,反之则是读取的文件

  • Python实现的大数据分析操作系统日志功能示例

    本文实例讲述了Python实现的大数据分析操作系统日志功能.分享给大家供大家参考,具体如下: 一 代码 1.大文件切分 import os import os.path import time def FileSplit(sourceFile, targetFolder): if not os.path.isfile(sourceFile): print(sourceFile, ' does not exist.') return if not os.path.isdir(targetFolde

  • Python Django框架实现应用添加logging日志操作示例

    本文实例讲述了Python Django框架实现应用添加logging日志.分享给大家供大家参考,具体如下: Django uses Python's builtin logging module to perform system logging. Django使用python的内建日志模块来记录系统日志,但是要想在django应用中开启此功能使我们的部分操作能够被记录到日志文件,那么就需要进行一定的配置并且根据具体的log类型来进行调用 step 1:配置setting.py 以下配置除了f

  • Python使用修饰器进行异常日志记录操作示例

    本文实例讲述了Python使用修饰器进行异常日志记录操作.分享给大家供大家参考,具体如下: 当脚本中需要进行的的相同的异常操作很多的时候,可以用修饰器来简化代码.比如我需要记录抛出的异常: 在log_exception.py文件中, import functools import logging def create_logger(): logger = logging.getLogger("test_log") logger.setLevel(logging.INFO) fh = l

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

    前言 曾经转载过一篇关于python日志模块logging的详解 https://www.cnblogs.com/linuxchao/p/linuxchao-log.html, 虽然这篇文章是别人写的, 但是我就是靠着这篇文章入门的logging,所以我觉得没必要再继续说些理论的东西,今天就简单的对日志做个封装,实际工作中直接拿去用吧 方法1 """ ------------------------------------ @Time : 2019/5/22 8:12 @Au

  • python 获取剪切板内容的两种方法

    第一种 # -*- coding: utf-8 -*- # @Time : 2020/3/16 21:26 # @File : get_text_from_cupboard_13.py # @Author: Hero Liu # python读取剪切板内容 import win32clipboard as w import win32con def get_text(): w.OpenClipboard() d = w.GetClipboardData(win32con.CF_TEXT) w.C

  • 通过Python实现电脑定时关机的两种方法

    目录 导语 一.普通人关机 二.程序员关机 1)Pyqt5界面化小程序 ​2)Tkinter界面化小程序 导语 无论家用电脑还是公司的电脑,定时开关机都是一个非常实用的功能,只是一般都不太受关注.定时关机不仅能延长电脑的使用寿命,还能节约超多的电费呢~哈哈哈哈​ 害~这不,周天休假一天,但是公司的电脑大部分的小伙伴儿就开了一天,有时候放长假的时候电脑一开就是几天.这不?隔壁的小姐姐已经被领导发现了,最后的最后这个事情就落到我手里了,开发一个能定时关机的源码项目供大家使用,并互相提醒每个人一定要下

  • python统计中文字符数量的两种方法

    方法一: def str_count(str): '''找出字符串中的中英文.空格.数字.标点符号个数''' count_en = count_dg = count_sp = count_zh = count_pu = 0 for s in str: # 英文 if s in string.ascii_letters: count_en += 1 # 数字 elif s.isdigit(): count_dg += 1 # 空格 elif s.isspace(): count_sp += 1 #

  • python 字典中取值的两种方法小结

    如下所示: a={'name':'tony','sex':'male'} 获得name的值的方式有两种 print a['name'],type(a['name']) print a.get('name'),type(a.get('name')) 发现这两个结果完全一致,并没有任何的差异. 怎么选择这两个不同的字典取值方式呢? 如果字典已知,我们可以任选一个,而当我们不确定字典中是否存在某个键时,我之前的做法如下 if 'age' in a.keys(): print a['age'] 因为不先

  • 使用Python将图片转正方形的两种方法实例代码详解

    一.将原图粘贴到一张正方形的背景上 def trans_square(image): r"""Open the image using PIL.""" image = image.convert('RGB') w, h = image.size background = Image.new('RGB', size=(max(w, h), max(w, h)), color=(127, 127, 127)) # 创建背景图,颜色值为127 leng

  • python 实现ping测试延迟的两种方法

    一.python实现ping返回延迟繁琐版 #!/usr/bin/python3.7 # !coding:utf-8 __author__ = 'hsz' __date__ = 'Thu Feb 27 22:41:15 EST 2020' import time import struct import socket import select import sys def chesksum(data): """ 校验 """ n = len(d

  • python文件读取read及readlines两种方法使用详解

    目录 引言 .read([size])方法 .readlines()方法 引言 with open() as 和open()都是打开,还没有读入文件 假设test.fa的内容如下图所示: ACGACGTAGCGTAGCTACGATCAGCGACGAGCTAGCGACGA .read([size])方法 read([size])方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它返回字符串对象. with open('test.fa') as fa: f = fa

  • Python识别二维码的两种方法详解

    目录 前言 pyzbar + PIL cv2 前言 最近在搜寻资料时,发现了一则10年前的新闻:二维码将成线上线下关键入口.从今天的移动互联网来看,支付收款码/健康码等等与我们息息相关,二维码确实成为了我们生活中不可或缺的一部分. 在学习Python处理二维码的过程中,我们看到的大多是“用python生成酷炫二维码”.“用Python制作动图二维码”之类的文章.而关于使用Python批量识别二维码的教程,并不多见.所以今天我会给大家分享两种批量识别二维码的Python技巧! pyzbar + P

  • 详解用Python为直方图绘制拟合曲线的两种方法

    直方图是用于展示数据的分组分布状态的一种图形,用矩形的宽度和高度表示频数分布,通过直方图,用户可以很直观的看出数据分布的形状.中心位置以及数据的离散程度等. 在python中一般采用matplotlib库的hist来绘制直方图,至于如何给直方图添加拟合曲线(密度函数曲线),一般来说有以下两种方法. 方法一:采用matplotlib中的mlab模块 mlab模块是Python中强大的3D作图工具,立体感效果极佳.在这里使用mlab可以跳出直方图二维平面图形的限制,在此基础上再添加一条曲线.在这里,

随机推荐