电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:56日期: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)傳參 千萬別做全局變量

補充: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)文章:
主站蜘蛛池模板: PC阳光板-PC耐力板-阳光板雨棚-耐力板雨棚,厂家定制[优尼科板材] | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 驾驶人在线_专业学车门户网站 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 精密模具-双色注塑模具加工-深圳铭洋宇通 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 信阳市建筑勘察设计研究院有限公司 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | 精密线材测试仪-电线电缆检测仪-苏州欣硕电子科技有限公司 | 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 辊道窑炉,辊道窑炉厂家-山东艾希尔| 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 搪瓷搅拌器,搪玻璃搅拌器,搪玻璃冷凝器_厂家-淄博越宏化工设备 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 元拓建材集团官方网站 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 厌氧反应器,IC厌氧反应器,厌氧三相分离器-山东创博环保科技有限公司 | 热风机_工业热风机生产厂家上海冠顶公司提供专业热风机图片价格实惠 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 斗式提升机,斗式提升机厂家-淄博宏建机械有限公司 | 深圳市超时尚职业培训学校,培训:月嫂,育婴,养老,家政;化妆,美容,美发,美甲. | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | 电缆接头_防水接头_电缆防水接头_防水电缆接头_上海闵彬 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 山东艾德实业有限公司| 特种阀门-调节阀门-高温熔盐阀-镍合金截止阀-钛阀门-高温阀门-高性能蝶阀-蒙乃尔合金阀门-福建捷斯特阀门制造有限公司 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 |