python操作日志的封裝方法(兩種方法)
前言
今天就簡(jiǎn)單的對(duì)日志做個(gè)封裝,實(shí)際工作中直接拿去用吧
方法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'):
"""設(shè)置handler級(jí)別并添加到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):
"""設(shè)置日志輸出格式"""
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):
"""關(guān)閉handler"""
stream_handler.close()
file_handler.close()
@property
def Logger(self):
"""構(gòu)造收集器,返回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')
初始化方法參數(shù)說(shuō)明
name:自定義日志的名字, 默認(rèn)是root, 但是我這里是使用調(diào)用文件的__name__ 作為默認(rèn)名字
path:生成的日志的文件名
level:日志的級(jí)別,我這里把所有的級(jí)別都默認(rèn)設(shè)置了level=DEBUG
方法2
使用logging.fileconfig這個(gè)模塊實(shí)現(xiàn)(不知道這個(gè)模塊的找度娘惡補(bǔ)一下把)
1.使用配置文件構(gòu)造日志配置信息
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')
總結(jié)
兩種方法各有好處吧
第一種代碼很好理解思路清晰 , 但是不利于項(xiàng)目都維護(hù),比如日志文件名,日志格式等無(wú)法修改,只能通過(guò)代碼內(nèi)部修改
第二種其實(shí)是使用config模塊內(nèi)部使用配置文件操作模塊ConfigParser做了封裝, 用配置文件來(lái)構(gòu)造自定義日志器,好處很明顯,我們只要通過(guò)修改配置文件就能修改日志的格式,名字,級(jí)別等等一些設(shè)置,無(wú)需改動(dòng)代碼,而且使用很簡(jiǎn)單, 其實(shí)這種方法完全不需要封裝一個(gè)python代碼,哪個(gè)模塊需要輸出日志,直接調(diào)用config模塊獲得logger就可以了(就是上面文件的那幾行代碼),今天就到這吧......
以上所述是小編給大家介紹的python操作日志的封裝方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- 基于python+selenium的二次封裝的實(shí)現(xiàn)
- python接口自動(dòng)化如何封裝獲取常量的類
- Python 面向?qū)ο笾庋b、繼承、多態(tài)操作實(shí)例分析
- Python3使用xml.dom.minidom和xml.etree模塊兒解析xml文件封裝函數(shù)的方法
- Python封裝成可帶參數(shù)的EXE安裝包實(shí)例
- bluepy 一款python封裝的BLE利器簡(jiǎn)單介紹
- Python面向?qū)ο蟪绦蛟O(shè)計(jì)中類的定義、實(shí)例化、封裝及私有變量/方法詳解
- Python底層封裝實(shí)現(xiàn)方法詳解
相關(guān)文章
python使用ddt過(guò)程中遇到的問(wèn)題及解決方案【推薦】
在使用DDT數(shù)據(jù)驅(qū)動(dòng)+HTMLTestRunner輸出測(cè)試報(bào)告時(shí)遇到過(guò)2個(gè)問(wèn)題,沒(méi)個(gè)問(wèn)題都很奇葩,下面小編通過(guò)本文給大家分享python使用ddt過(guò)程中遇到的問(wèn)題及解決方案,需要的朋友參考下吧2018-10-10
關(guān)于微信小程序爬蟲token自動(dòng)更新問(wèn)題
本文主要介紹了關(guān)于微信小程序爬蟲關(guān)于token自動(dòng)更新問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
python networkx 包繪制復(fù)雜網(wǎng)絡(luò)關(guān)系圖的實(shí)現(xiàn)
這篇文章主要介紹了python networkx 包繪制復(fù)雜網(wǎng)絡(luò)關(guān)系圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python break和continue用法對(duì)比
在本篇文章里小編給大家整理的是一篇關(guān)于python break和continue用法對(duì)比內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2021-06-06
基于python3 pyQt5 QtDesignner實(shí)現(xiàn)窗口化猜數(shù)字游戲功能
這篇文章主要介紹了基于python3 pyQt5 QtDesignner實(shí)現(xiàn)窗口化猜數(shù)字游戲功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07

