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

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

解決python logging遇到的坑 日志重復打印問題

瀏覽:199日期:2022-06-24 18:44:55

python 中 logging模塊 假如遇到 多線程 或者 多進程 或者在web框架中自定義logging的話(一個請求就是一個獨立的線程)非常容易重復打印日志 和造成內存崩潰,所以:

解決方法如下:

重寫日志方法 用類:

class Log(): import logging def __init__(self): self.logger = logging.getLogger(__name__) # 以下三行為清空上次文件 # 這為清空當前文件的logging 因為logging會包含所有的文件的logging logging.Logger.manager.loggerDict.pop(__name__) # 將當前文件的handlers 清空 self.logger.handlers = [] # 然后再次移除當前文件logging配置 self.logger.removeHandler(self.logger.handlers) # 這里進行判斷,如果logger.handlers列表為空,則添加,否則,直接去寫日志 if not self.logger.handlers: # loggger 文件配置路徑 self.handler = logging.FileHandler(os.getcwd() + ’/logger/%s_log/%s_score.log’ % (str(dt.date.today()), str(dt.date.today()))) # logger 配置等級 self.logger.setLevel(logging.DEBUG) # logger 輸出格式 formatter = logging.Formatter(’%(asctime)s - %(levelname)s - %(name)s - %(message)s’) # 添加輸出格式進入handler self.handler.setFormatter(formatter) # 添加文件設置金如handler self.logger.addHandler(self.handler) # 以下皆為重寫方法 并且每次記錄后清除logger def info(self,message=None): self.__init__() self.logger.info(message) self.logger.removeHandler(self.logger.handlers) def debug(self,message=None): self.__init__() self.logger.debug(message) self.logger.removeHandler(self.logger.handlers) def warning(self,message=None): self.__init__() self.logger.warning(message) self.logger.removeHandler(self.logger.handlers) def error(self,message=None): self.__init__() self.logger.error(message) self.logger.removeHandler(self.logger.handlers) def critical(self, message=None): self.__init__() self.logger.critical(message) self.logger.removeHandler(self.logger.handlers)

親測有效!

另外 模塊尤其注意 例如web請求的時候 在接口處調用 然后引導傳參 千萬別做全局變量

補充:python中多個文件共用logger,重復打印問題的解決方案

問題背景&現象

最近在項目中,需要用python的logging庫來將日志打印到文件中,然后將python腳本放到crontab中執行。所以寫了一個logger的簡單封裝。

如下:

#!/usr/bin/python# -*- coding:utf-8 -*- import loggingimport timeimport os class Log(object): ’’’封裝后的logging ’’’ def __init__(self, logger=None, log_cate=’search’): ’’’ 指定保存日志的文件路徑,日志級別,以及調用文件 將日志存入到指定的文件中 ’’’ # 創建一個logger self.logger = logging.getLogger(logger) self.logger.setLevel(logging.DEBUG) # 創建一個handler,用于寫入日志文件 self.log_time = time.strftime('%Y_%m_%d') file_dir = os.getcwd() + ’/../log’ if not os.path.exists(file_dir): os.mkdir(file_dir) self.log_path = file_dir self.log_name = self.log_path + '/' + log_cate + '.' + self.log_time + ’.log’ # print(self.log_name) fh = logging.FileHandler(self.log_name, ’a’) # 追加模式 這個是python2的 # fh = logging.FileHandler(self.log_name, ’a’, encoding=’utf-8’) # 這個是python3的 fh.setLevel(logging.INFO) # 再創建一個handler,用于輸出到控制臺 ch = logging.StreamHandler() ch.setLevel(logging.INFO) # 定義handler的輸出格式 formatter = logging.Formatter( ’[%(asctime)s] %(filename)s->%(funcName)s line:%(lineno)d [%(levelname)s]%(message)s’) fh.setFormatter(formatter) ch.setFormatter(formatter) # 給logger添加handler self.logger.addHandler(fh) self.logger.addHandler(ch) # 添加下面一句,在記錄日志之后移除句柄 # self.logger.removeHandler(ch) # self.logger.removeHandler(fh) # 關閉打開的文件 fh.close() ch.close() def getlog(self): return self.logger

目的是讓所有用到logger的地方,只import這個封裝庫就行,然后直接調用。比如調用logger的

a.py

#!/usr/bin/python# -*- coding:utf-8 -*- from common.log import Loglog = Log().getlog()log.info('I am a.py')

b.py

#!/usr/bin/python# -*- coding:utf-8 -*- from common.log import Loglog = Log().getlog()log.info('I am b.py')

c.py

#!/usr/bin/python# -*- coding:utf-8 -*- import aimport bfrom common.log import Log log = Log().getlog()log.info('I am c.py')

此時執行c.py的結果如下:

➜ search git:(master) ✗ python c.py

[2019-01-14 15:58:35,807] a.py-><module> line:6 [INFO]I am a.py

[2019-01-14 15:58:35,808] b.py-><module> line:6 [INFO]I am b.py

[2019-01-14 15:58:35,808] b.py-><module> line:6 [INFO]I am b.py

[2019-01-14 15:58:35,809] c.py-><module> line:8 [INFO]I am c.py

[2019-01-14 15:58:35,809] c.py-><module> line:8 [INFO]I am c.py

[2019-01-14 15:58:35,809] c.py-><module> line:8 [INFO]I am c.py

可見,a.py, b.py,c.py的logger共用了,出現了重復打印。

問題原因分析

從現象可以得出,不同文件間的log系統是相互影響的,在a.py,b.py, c.py中,我們的調用方式是log = Log().getlog(), 即self.logger = logging.getLogger(logger),logger參數并未傳遞 , 所以得到的self.logger是RootLogger。

RootLogger是一個python程序內全局唯一的,所有Logger對象的祖先。所以我們對RootLogger的設定,自然會影響到所有的日志輸出。簡言之,就是先打開的文件中對log的設置,后打開的文件都會受到影響,都會走一遍logger的繼承關系。在這個示例中,b.py在a.py之后被import, 所以b.py會執行一次自己的logger,再執行一次a.py中打開的RootLogger, 以此類推.........

問題解決方式

不用默認的RootLogger, 給每個Logger都加個名字。

a.py

from common.log import Loglog = Log(__name__).getlog()log.info('I am a.py')

b.py

from common.log import Loglog = Log(__name__).getlog()log.info('I am b.py')

c.py

import bimport a from common.log import Log log = Log(__name__).getlog()log.info('I am c.py')

c.py的最新執行結果:

➜ search git:(master) ✗ python c.py

[2019-01-14 16:24:12,008] b.py-><module> line:6 [INFO]I am b.py

[2019-01-14 16:24:12,009] a.py-><module> line:6 [INFO]I am a.py

[2019-01-14 16:24:12,009] c.py-><module> line:10 [INFO]I am c.py

沒有重復了,符合預期。問題得以解決。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久亚洲国产| av免费不卡国产观看| 精品一区二区三区中文字幕在线| 91精品麻豆| 91成人在线网站| 欧美日韩91| 国产精品日本一区二区不卡视频| 国产伦精品一区二区三区千人斩 | 精品理论电影在线| 国产成人a视频高清在线观看| 女生影院久久| 日韩一区亚洲二区| 99riav1国产精品视频| 亚洲综合婷婷| 国产精品一区二区av日韩在线| 精品亚洲a∨一区二区三区18| 黄色aa久久| 国产亚洲一级| 欧美精品三级在线| 激情综合五月| av一区在线| 久热精品在线| 日韩av成人高清| 精品国产aⅴ| 免费毛片在线不卡| 色综合视频一区二区三区日韩 | 亚洲婷婷免费| 中文不卡在线| 国产精品亚洲综合在线观看| 国产精品99一区二区三| 午夜精品亚洲| 国产日韩中文在线中文字幕| 黑森林国产精品av| 久久国产精品久久w女人spa| 国产毛片一区二区三区 | 不卡一区综合视频| 亚洲精品中文字幕99999| 欧美国产日本| 麻豆理论在线观看| 国产亚洲欧洲| 美女国产精品久久久| 国精品一区二区| 婷婷精品在线| 成人av三级| 亚洲精品国产精品粉嫩| 久久久久黄色| 亚洲一区欧美二区| 国产福利亚洲| 国产手机视频一区二区| 久久久久伊人| 久久成人国产| 日韩av片子| 日韩有吗在线观看| 国产一区2区在线观看| 国产视频一区三区| 国产一区二区三区久久| 久久国产精品毛片| 色欧美自拍视频| 亚洲2区在线| 99视频精品全部免费在线视频| 日韩av一区二区三区| 欧美+日本+国产+在线a∨观看| 国产精品一区毛片| 亚洲视频播放| 欧美日韩视频网站| 欧美日韩网址| 丝瓜av网站精品一区二区| 国产96在线亚洲| 日韩在线卡一卡二| 99久久婷婷这里只有精品| 麻豆精品在线播放| 亚洲精品美女| 亚洲国产成人精品女人| 高清一区二区| 国产日韩视频| 亚洲一区二区免费看| 激情国产在线| 国产精品对白| 日韩成人一级| 日韩在线a电影| 欧美日韩国产传媒| 日韩另类视频| 精品久久久中文字幕| 婷婷综合一区| 热久久国产精品| 午夜日韩福利| 久久中文字幕av一区二区不卡| 麻豆国产精品777777在线| 日本不卡一区二区| 国产毛片一区| 91精品成人| 天堂√中文最新版在线| 国产精品**亚洲精品| 青青国产精品| 日韩精彩视频在线观看| 亚洲婷婷丁香| 日韩精品一二三区| 日韩一级网站| 久久要要av| 久久精品91| 三级小说欧洲区亚洲区| 色在线视频观看| 91视频一区| 国产盗摄——sm在线视频| 精品视频亚洲| 欧美一级二区| 欧美三区不卡| 国产日韩欧美一区二区三区在线观看| 日韩三级精品| 欧美在线日韩| 国产精品久久久久久久久久齐齐| 国产欧美日韩一区二区三区四区| 日韩福利视频导航| 综合欧美精品| 色综合视频一区二区三区日韩 | 日韩精品高清不卡| 中文字幕乱码亚洲无线精品一区| 日韩专区在线视频| 中文字幕一区二区精品区| 在线视频亚洲欧美中文| 中文字幕一区二区三区四区久久| 丝袜美腿高跟呻吟高潮一区| 国产精品普通话对白| 久久性天堂网| 婷婷五月色综合香五月| 青青国产精品| 国产精品国码视频| 久久一区亚洲| 美女精品久久| 97国产成人高清在线观看| 国产成人精品一区二区三区免费| 国产精品麻豆久久| 91精品国产成人观看| 欧美日韩国产亚洲一区| 三级欧美韩日大片在线看| 91精品国产自产在线丝袜啪| 国产精品99精品一区二区三区∴| 欧美国产日韩电影| 水蜜桃久久夜色精品一区| 亚洲成人国产| 老鸭窝毛片一区二区三区| 午夜精品影视国产一区在线麻豆| 国产女人18毛片水真多18精品| 国产精品网站在线看| 成人国产精品一区二区网站| 亚洲第一精品影视| 亚洲aa在线| 美腿丝袜在线亚洲一区| 日韩欧美午夜| 水野朝阳av一区二区三区| 欧美日韩xxxx| 日韩黄色大片| 久久亚洲影院| 国产福利一区二区精品秒拍 | 黄毛片在线观看| 波多野结衣一区| 综合激情网站| 国产黄色精品| 91精品一区二区三区综合在线爱| 亚洲我射av| 精品亚洲二区| 黄色国产精品| 国产精品最新自拍| 久久久国产精品一区二区中文| 一区二区三区四区日韩| 精品午夜视频| 亚洲精品1区| 97久久中文字幕| 少妇久久久久| 香蕉久久久久久| 国产v日韩v欧美v| 黄色亚洲大片免费在线观看| 91精品国产自产观看在线| 欧美日韩视频免费观看| 三级在线观看一区二区| 精品国产成人| 老牛影视一区二区三区| 韩日一区二区| 在线视频亚洲欧美中文| 日本精品黄色| 亚洲精品自拍| 正在播放日韩精品| 亚洲人成亚洲精品| 欧美丰满日韩| 日韩av在线免费观看不卡| 91精品精品| 国产精区一区二区| 一区在线免费观看| 麻豆精品新av中文字幕| 久久国产99| 在线看片福利| 欧美日一区二区三区在线观看国产免| 久久久水蜜桃av免费网站| 91伊人久久| 一区视频在线| 97精品国产| 奇米亚洲欧美| 免费中文字幕日韩欧美| 日韩精品2区| 国产精品777777在线播放|