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

您的位置:首頁技術(shù)文章
文章詳情頁

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

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

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

解決方法如下:

重寫日志方法 用類:

class Log(): import logging def __init__(self): self.logger = logging.getLogger(__name__) # 以下三行為清空上次文件 # 這為清空當(dāng)前文件的logging 因為logging會包含所有的文件的logging logging.Logger.manager.loggerDict.pop(__name__) # 將當(dāng)前文件的handlers 清空 self.logger.handlers = [] # 然后再次移除當(dāng)前文件logging配置 self.logger.removeHandler(self.logger.handlers) # 這里進(jìn)行判斷,如果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’) # 添加輸出格式進(jìn)入handler self.handler.setFormatter(formatter) # 添加文件設(shè)置金如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請求的時候 在接口處調(diào)用 然后引導(dǎo)傳參 千萬別做全局變量

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

問題背景&現(xiàn)象

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

如下:

#!/usr/bin/python# -*- coding:utf-8 -*- import loggingimport timeimport os class Log(object): ’’’封裝后的logging ’’’ def __init__(self, logger=None, log_cate=’search’): ’’’ 指定保存日志的文件路徑,日志級別,以及調(diào)用文件 將日志存入到指定的文件中 ’’’ # 創(chuàng)建一個logger self.logger = logging.getLogger(logger) self.logger.setLevel(logging.DEBUG) # 創(chuàng)建一個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) # 再創(chuàng)建一個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) # 關(guān)閉打開的文件 fh.close() ch.close() def getlog(self): return self.logger

目的是讓所有用到logger的地方,只import這個封裝庫就行,然后直接調(diào)用。比如調(diào)用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')

此時執(zhí)行c.py的結(jié)果如下:

➜ 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共用了,出現(xiàn)了重復(fù)打印。

問題原因分析

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

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

問題解決方式

不用默認(rèn)的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的最新執(zhí)行結(jié)果:

➜ 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

沒有重復(fù)了,符合預(yù)期。問題得以解決。

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

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
青青草国产成人99久久| 国产一区国产二区国产三区 | 国产精品亚洲综合在线观看| 欧美一级二级视频| 成人黄色av| 欧美日韩在线精品一区二区三区激情综合| 国产一区精品福利| 亚洲作爱视频| 国产精品久久亚洲不卡| 日韩av资源网| 久久精品国产99久久| 日韩精品第二页| 欧美激情另类| 日韩精品1区2区3区| 天堂av在线| www成人在线视频| 色婷婷精品视频| 国产精品高潮呻吟久久久久| 欧美日韩国产免费观看视频| 日韩免费久久| 久久激五月天综合精品| 亚洲福利久久| 亚洲激情欧美| 国产自产自拍视频在线观看| 在线观看精品| 日韩一区二区三区在线看| 伊人精品久久| 免费在线成人| 先锋影音久久久| 伊人久久大香伊蕉在人线观看热v| 精品国产美女a久久9999| 亚洲1区在线观看| 88久久精品| 性色一区二区| 欧美丝袜一区| 国产乱码精品一区二区三区四区 | 日韩制服丝袜先锋影音| 日韩中文影院| 韩日一区二区| 免费在线观看精品| 99精品电影| 色在线中文字幕| 在线一区电影| 日韩av中文字幕一区二区| 中文欧美日韩| 国产午夜精品一区在线观看| 中文字幕亚洲精品乱码| 日韩高清欧美激情| 国产欧美自拍| 欧美高清不卡| 中文字幕在线免费观看视频| 欧美天堂亚洲电影院在线观看| 免费在线播放第一区高清av| 色狠狠一区二区三区| 国产一区二区三区不卡视频网站 | 欧美日韩中文一区二区| 国内精品麻豆美女在线播放视频| 日韩精品欧美激情一区二区| 亚洲国产福利| 91精品国产自产在线丝袜啪| 亚洲精品一级二级| 精品国产不卡一区二区| 国产激情综合| 日韩一区二区三区四区五区| 美女久久网站| 亚洲综合精品四区| 99国产一区| 国产高清亚洲| 国产精品v亚洲精品v日韩精品| 亚洲精品在线二区| 樱桃视频成人在线观看| 91嫩草亚洲精品| 国产一区二区三区国产精品| 日韩欧美少妇| 国产在线|日韩| 国产毛片精品| 久久99精品久久久野外观看| 亚洲深夜影院| 日本电影久久久| 伊人久久婷婷| 国产高清亚洲| 精品美女久久| 黑人精品一区| 免费高清在线一区| 国产 日韩 欧美 综合 一区| 日韩成人免费| 久久男人天堂| 日韩精品国产精品| 久久激情五月婷婷| 国产一区二区三区不卡视频网站 | 成人午夜亚洲| 天堂资源在线亚洲| 免费不卡在线观看| 久久久久亚洲| 亚洲午夜久久| 国产精品巨作av| 欧美国产美女| 亚洲欧美日韩国产一区二区| 国产免费av一区二区三区| 中文字幕亚洲影视| 国产精品毛片久久| 亚洲一级在线| 视频一区中文字幕精品| 成人午夜网址| 黄色成人在线网址| 国产日韩欧美一区在线| 免费久久99精品国产自在现线| 日本午夜精品久久久久| 免费在线播放第一区高清av| 婷婷色综合网| 91成人精品在线| 视频一区中文字幕精品| 国产麻豆精品久久| 91p九色成人| 亚洲va中文在线播放免费| 亚洲性视频h| 久久精品伊人| 欧美日韩一区二区三区视频播放| 精品国产美女a久久9999| 国精品产品一区| 亚洲婷婷丁香| 亚州精品视频| 国产精品视频3p| 国产私拍福利精品视频二区| 免费看av不卡| 亚洲自拍另类| 久久国产精品免费一区二区三区| 国产精品99久久免费观看| 欧美成a人免费观看久久| 久久av在线| 日韩综合在线| 亚欧洲精品视频在线观看| 亚洲手机在线| 国产探花在线精品| 国产精品一国产精品| 成人在线网站| 久久精品观看| 亚洲二区免费| 精品美女久久| 欧美中文字幕一区二区| 一区二区亚洲精品| 国产精品普通话对白| 男人操女人的视频在线观看欧美| 国产精品免费大片| 日韩深夜视频| 米奇777超碰欧美日韩亚洲| 精品国产99| 亚洲精品激情| 日韩一级不卡| 日韩在线精品| 久久精品资源| 久久精品亚洲人成影院| 国产精品传媒麻豆hd| 日本激情一区| 在线一区视频| 精品国产中文字幕第一页| 中文一区一区三区免费在线观| 日韩一区二区三区免费播放| 精品一区二区三区视频在线播放| 日韩精品欧美精品| 热三久草你在线| 色在线中文字幕| 国产suv精品一区| 日本在线成人| 国产美女久久| 国产黄色一区| 婷婷久久免费视频| 欧美一级一区| 国产乱码精品一区二区三区四区| 激情婷婷欧美| 1024精品一区二区三区| 久久伊人久久| 麻豆一区二区99久久久久| 免费欧美一区| 国产精品嫩草99av在线| 日韩国产一二三区| 国产精品综合色区在线观看| 国产日韩三级| 国产免费av一区二区三区| 国产精品成人一区二区网站软件| 国产精品一区二区三区四区在线观看 | 中文一区一区三区免费在线观 | 久久wwww| 麻豆久久一区| 免费在线成人| 青草久久视频| 久久精品高清| 欧美va天堂| 性欧美精品高清| 蜜臀av国产精品久久久久| 香蕉久久久久久久av网站| 高清不卡一区| 在线日韩视频| 爽爽淫人综合网网站| 免费精品国产| 日韩高清成人在线| 国产成人免费| 精品久久国产一区| 免费国产自久久久久三四区久久 | 亚洲精品麻豆|