日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python logging日志模塊 配置文件方式

瀏覽:32日期:2022-07-17 18:18:21

在一些微服務或web服務中我們難免需要日志功能,用來記錄一些用戶的登錄記錄,操作記錄,以及一些程序的崩潰定位,執行訪問定位等等;

Python內置 非常強大的日志模塊 ==> logging 今天給大家分享一下以配置文件形式進行配置log日志 ;

Centos6.7

Python3.6

logging0.5.1.2

logging模塊有三個比較重要的功能組件:

1、loggers 配置文件可定義一些輸出日志的appname

2、handler 過濾器,比如設置日志的分隔大小,輸出位置,日志文件創建等

3、formatters 指定日志輸出的格式

1: 創建一個文件,以.conf結尾 或以.ini結尾(PS: 其他的結尾沒試過,你可以試試)

vim log.conf

2: 定義日志輸出的APP名,指定過濾器這里用loggers功能

[loggers]#固定寫法keys=root,error,info #創建三個app名,root是父類,必需存在的[logger_root] #創建完的app名我們要定義一些規則,嚴格要求格式為'logger_appname'level=DEBUG #設置日志級別qualname=root #這里在'root'appname下可以不填,所有沒獲取get的情況下默認app名都是roothandlers=debugs #設置指定過濾器,多個以逗號分隔,這個名字待會兒 我們會以固定格式'handler_(value)'創建[logger_error]level=ERRORqualname=error #除了root appname以外,定義的app名必須要設置這個屬性,用于定義打印輸出時候的app名handlers=errors[logger_info]level=INFOqualname=INFOhandlers=infos

3: 定義日志過濾器這里用handler功能

[handlers] #固定格式keys=infos,errors,debugs #定義過濾器名稱,下面定義以handler_keysname格式定義,上面引用名稱必須和keys一致[handler_infos] class=FileHandler #指定過濾器組件,詳情請看官網,這個是以文件方式創建level=INFO #設置級別formatter=form01 #定義日志打印格式,下面會創建formatters,格式也是嚴格要求formatter_keysname 創建args=(’info.log’,’a’) #創建文件名字,以什么方式打開[handler_errors] class=FileHandlerlevel=DEBUGformatter=form02args=(’info1.log’,’a’)[handler_debugs] class=FileHandlerlevel=DEBUGformatter=form02args=(’info1.log’,’a’)

3: 定義日志輸出格式,這里我們介紹最后一個組件formatters

[formatters] #固定格式keys=form01,form02 #定義名稱,下面會引用格式同上[formatter_form01]format=%(asctime)s %(filename)s %(levelname)s %(message)s #年-月-日 時-分-秒,毫秒,文件名,級別名,消息信息datefmt=%Y-%m-%d %H:%M:%S #日期輸出格式[formatter_form02]format=%(asctime)s %(filename)s %(levelname)s %(message)sdatefmt=%Y-%m-%d %H:%M:%S

4: 具體程序引用

#!/usr/bin/env pythonimport logging import logging.config logging.config.fileConfig(’log.conf’)logs = logging.getLogger(’error’)logs.error(’errorsssss’)

補充知識:python按照日志等級將日志輸出至不同的日志文件

將日志按照等級分別保存在不同的文件中,并在控制臺同步輸出。

import osimport sysimport loggingfrom logs.multiprocessloghandler import MultiprocessHandlerdef loggerDefine(platform, log_name): base_dir = 'F:PythonProjectxiao_new_resourceslogs' info_dir_path = base_dir + 'info{}'.format(platform) error_dir_path = base_dir + 'error{}'.format(platform) # 判斷響應的文件是否存在 if not os.path.exists(info_dir_path): os.makedirs(info_dir_path) info_dir = os.path.join(info_dir_path, log_name) if not os.path.exists(error_dir_path): os.makedirs(error_dir_path) error_dir = os.path.join(error_dir_path, log_name) # 返回一個logger對象,如果沒有指定名字將返回root logger log = logging.getLogger(’test’) # 定義日志輸出格式 formattler = ’%(asctime)s|%(processName)s|%(threadName)s|%(levelname)s|%(filename)s:%(lineno)d|%(funcName)s|%(message)s’ fmt = logging.Formatter(formattler) # 設置日志控制臺輸出 stream_handler = logging.StreamHandler(sys.stdout) stream_handler.setLevel(logging.INFO) # 設置控制臺文件輸出 log_handler_info = MultiprocessHandler(info_dir) log_handler_err = MultiprocessHandler(error_dir) # 設置日志輸出格式: stream_handler.setFormatter(fmt) log_handler_info.setFormatter(fmt) log_handler_err.setFormatter(fmt) # 設置過濾條件 info_filter = logging.Filter() info_filter.filter = lambda record: record.levelno < logging.WARNING # 設置過濾等級 err_filter = logging.Filter() err_filter.filter = lambda record: record.levelno >= logging.WARNING # 對文件輸出日志添加過濾條件 log_handler_info.addFilter(info_filter) log_handler_err.addFilter(err_filter) # 對logger增加handler日志處理器 log.addHandler(log_handler_info) log.addHandler(log_handler_err) log.addHandler(stream_handler) log.setLevel('INFO') return logif __name__ == ’__main__’: logg = loggerDefine('youtube', 'youtube.log') logg.info('info') logg.warning('warning') logg.error('error')

multiprocessloghandler源碼:

import datetimeimport loggingimport osimport retry: import codecsexcept ImportError: codecs = Noneclass MultiprocessHandler(logging.FileHandler): '''支持多進程的TimedRotatingFileHandler''' def __init__(self, filename, when=’D’, backupCount=7, encoding='utf-8', delay=False): ''' filename 日志文件名,when 時間間隔的單位,backupCount 保留文件個數 delay 是否開啟 OutSteam緩存 True 表示開啟緩存,OutStream輸出到緩存,待緩存區滿后,刷新緩存區,并輸出緩存數據到文件。 False表示不緩存,OutStrea直接輸出到文件 ''' self.prefix = filename self.backupCount = backupCount self.when = when.upper() # 正則匹配 年-月-日 # 正則寫到這里就對了 self.extMath = r'd{4}-d{2}-d{2}' # S 每秒建立一個新文件 # M 每分鐘建立一個新文件 # H 每天建立一個新文件 # D 每天建立一個新文件 self.when_dict = { ’S’: '%Y-%m-%d-%H-%M-%S', ’M’: '%Y-%m-%d-%H-%M', ’H’: '%Y-%m-%d-%H', ’D’: '%Y-%m-%d' } # 日志文件日期后綴 self.suffix = self.when_dict.get(when) # 源碼中self.extMath寫在這里 # 這個正則匹配不應該寫到這里,不然非D模式下 會造成 self.extMath屬性不存在的問題 # 不管是什么模式都是按照這個正則來搜索日志文件的。 # if self.when == ’D’: # 正則匹配 年-月-日 # self.extMath = r'^d{4}-d{2}-d{2}' if not self.suffix: raise ValueError(u'指定的日期間隔單位無效: %s' % self.when) # 拼接文件路徑 格式化字符串 self.filefmt = os.path.join(os.getcwd(), '%s.%s' % (self.prefix, self.suffix)) a = '%s.%s' % (self.prefix, self.suffix) # 使用當前時間,格式化文件格式化字符串 self.filePath = datetime.datetime.now().strftime(self.filefmt) # 獲得文件夾路徑 _dir = os.path.dirname(self.filefmt) try: # 如果日志文件夾不存在,則創建文件夾 if not os.path.exists(_dir):os.makedirs(_dir) except Exception: print('創建文件夾失敗') print('文件夾路徑:' + self.filePath) pass if codecs is None: encoding = None # 調用FileHandler logging.FileHandler.__init__(self, self.filePath, ’a+’, encoding, delay) def shouldChangeFileToWrite(self): '''更改日志寫入目的寫入文件 return True 表示已更改,False 表示未更改''' # 以當前時間獲得新日志文件路徑 _filePath = datetime.datetime.now().strftime(self.filefmt) # 新日志文件日期 不等于 舊日志文件日期,則表示 已經到了日志切分的時候 # 更換日志寫入目的為新日志文件。 # 例如 按 天 (D)來切分日志 # 當前新日志日期等于舊日志日期,則表示在同一天內,還不到日志切分的時候 # 當前新日志日期不等于舊日志日期,則表示不在 # 同一天內,進行日志切分,將日志內容寫入新日志內。 if _filePath != self.filePath: self.filePath = _filePath return True return False def doChangeFile(self): '''輸出信息到日志文件,并刪除多于保留個數的所有日志文件''' # 日志文件的絕對路徑 self.baseFilename = os.path.abspath(self.filePath) # stream == OutStream # stream is not None 表示 OutStream中還有未輸出完的緩存數據 if self.stream: # self.stream.flush() self.stream.close() self.stream = None # delay 為False 表示 不OutStream不緩存數據 直接輸出 # 所有,只需要關閉OutStream即可 if not self.delay: # self.stream.close() self.stream = self._open() # 刪除多于保留個數的所有日志文件 if self.backupCount > 0: for s in self.getFilesToDelete():# print sos.remove(s) def getFilesToDelete(self): '''獲得過期需要刪除的日志文件''' # 分離出日志文件夾絕對路徑 # split返回一個元組(absFilePath,fileName) # 例如:split(’I:ScripPythonchar4mybookutillogsmylog.2017-03-19) # 返回(I:ScripPythonchar4mybookutillogs, mylog.2017-03-19) # _ 表示占位符,沒什么實際意義, dirName, _ = os.path.split(self.baseFilename) fileNames = os.listdir(dirName) result = [] # self.prefix 為日志文件名 列如:mylog.2017-03-19 中的 mylog # 加上 點號 . 方便獲取點號后面的日期 prefix = self.prefix prefix = _.rsplit('.', 1)[0] + '.' plen = len(prefix) for fileName in fileNames: if fileName[:plen] == prefix:# 日期后綴 mylog.2017-03-19 中的 2017-03-19suffix = fileName[plen:]# 匹配符合規則的日志文件,添加到result列表中if re.compile(self.extMath).match(suffix): result.append(os.path.join(dirName, fileName)) result.sort() # 返回 待刪除的日志文件 # 多于 保留文件個數 backupCount的所有前面的日志文件。 if len(result) < self.backupCount: result = [] else: result = result[:len(result) - self.backupCount] return result def emit(self, record): '''發送一個日志記錄 覆蓋FileHandler中的emit方法,logging會自動調用此方法''' try: if self.shouldChangeFileToWrite():self.doChangeFile() logging.FileHandler.emit(self, record) except (KeyboardInterrupt, SystemExit): raise except: self.handleError(record)

以上這篇Python logging日志模塊 配置文件方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区二区高清| 国产偷自视频区视频一区二区| 欧美精品九九| 美女毛片一区二区三区四区 | 国产精品一站二站| 日韩精品视频网站| 欧美视频一区| 国产精品亚洲产品| 久久精品三级| 福利视频一区| 日韩精品网站| 欧美日中文字幕| 日韩亚洲精品在线| 中文在线日韩| 国产欧美日韩在线观看视频| 国产精品一二| 国产一区二区三区不卡av| 日本蜜桃在线观看视频| 欧美 日韩 国产一区二区在线视频| 久久久777| аⅴ资源天堂资源库在线| 精品国产a一区二区三区v免费| 国产精品theporn| 精品精品99| 四虎国产精品免费观看| 久久久久久久久久久9不雅视频| 欧美日韩国产一区二区三区不卡| 在线亚洲欧美| 日韩欧美四区| 国产一区调教| 美女一区网站| 亚洲在线免费| 国产伦理久久久久久妇女| 精品99在线| 女人天堂亚洲aⅴ在线观看| 亚洲理论在线| 国产精品久久久久久久久妇女| 亚洲国内欧美| 日韩一区二区三区四区五区| 麻豆91小视频| 尹人成人综合网| 国产欧美三级| 国产主播一区| 日本午夜精品视频在线观看| 精品一区二区三区中文字幕| 日韩中文在线电影| 首页欧美精品中文字幕| 国产剧情在线观看一区| 亚洲精品日韩久久| 天堂av在线一区| 国产精品主播在线观看| 色88888久久久久久影院| 中文一区一区三区免费在线观 | 亚洲久久视频| 精品日韩一区| 日韩精品一级中文字幕精品视频免费观看 | 影音先锋久久| 久久激五月天综合精品| 国产亚洲一区二区手机在线观看| 亚洲三级观看| 99成人在线视频| 日韩av一区二区在线影视| 午夜久久中文| 日韩精选在线| 欧美一级精品| 欧美国产极品| 综合视频一区| 久久国产成人午夜av影院宅| 国产欧美91| 久久国产精品毛片| 国产精品亚洲一区二区三区在线观看| 日韩中文字幕一区二区高清99| 成人午夜毛片| 日韩精彩视频在线观看| 美女网站一区| 理论片午夜视频在线观看| 日韩三级视频| 日韩一级欧洲| 久久精品伊人| 亚洲综合图色| 久久久夜精品| 久久精品天堂| 91九色综合| 一区久久精品| 国产美女高潮在线观看| 国产午夜久久av| 在线 亚洲欧美在线综合一区| 国产日韩欧美三级| 中文亚洲欧美| 久久久成人网| 激情中国色综合| 欧美综合精品| 午夜在线精品| 欧美成人午夜| 波多视频一区| 精品久久不卡| 老鸭窝一区二区久久精品| 欧美亚洲免费| 亚洲男人在线| 久久福利精品| 在线亚洲欧美| 狠狠操综合网| 久久久久99| 国产精品毛片久久| 精品视频一区二区三区在线观看| 日韩一二三区在线观看| 在线视频亚洲欧美中文| 亚洲一区国产| 一区在线免费| 国产精品久久乐| 在线观看一区| 视频一区二区三区入口| 亚洲国产不卡| 国产91精品对白在线播放| 97人人精品| 久久99高清| 手机在线电影一区| 久久婷婷国产| 国产精品色在线网站| 日韩精品福利一区二区三区| 美女久久一区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲黄色影院| 亚洲色图网站| 日本亚洲视频| 五月激激激综合网色播| 亚欧洲精品视频在线观看| 亚洲视频国产| 日韩一区免费| 久久国内精品自在自线400部| 日韩久久一区| 国产精品99久久久久久董美香| 日本特黄久久久高潮| 欧美日韩1区2区3区| 国产日韩欧美三级| 精品资源在线| 日韩不卡免费高清视频| 久久天堂av| 久久高清免费观看| 一区二区三区午夜视频| 欧美激情综合| 欧美成人综合| 欧美亚洲网站| 午夜av成人| 日本中文字幕视频一区| 视频在线不卡免费观看| 日韩一级网站| 日本不卡视频在线观看| 国际精品欧美精品| 久久成人国产| 丰满少妇一区| 玖玖精品视频| 国产一区丝袜| 视频一区视频二区中文字幕| 欧美国产先锋| 日韩午夜av| 美女久久久久久| 亚洲欧美久久| 97精品国产福利一区二区三区| 欧美资源在线| 精品国产免费人成网站| 一区二区三区国产盗摄| 免费精品一区| 一本一道久久a久久精品蜜桃| 欧美天堂一区二区| 欧美在线亚洲| 日韩av在线中文字幕| 亚洲精华国产欧美| 久久99影视| 中文不卡在线| 国产亚洲一区二区手机在线观看| 免费一级片91| 日韩二区在线观看| 亚洲四虎影院| 国产精品一国产精品| 最新亚洲激情| 精品一区二区三区免费看| 国产视频一区免费看| 日日夜夜免费精品| 激情久久五月| 国产激情久久| 视频一区二区三区入口| 91亚洲一区| 国产毛片精品| 香蕉视频成人在线观看| 婷婷综合一区| 97se亚洲| 伊人久久高清| 喷白浆一区二区| 欧美aⅴ一区二区三区视频| 久久久精品网| 欧美日韩18| 亚洲精品网址| 91麻豆精品激情在线观看最新 | 国产成人精品免费视| 激情五月综合网| 国产精品久久久久久久久免费高清 | 精品一区二区三区的国产在线观看 | 久久国产精品亚洲77777| 精品视频在线观看网站|