在python logger中获取双重日志 - 代码具有循环依赖性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在python logger中获取双重日志 - 代码具有循环依赖性相关的知识,希望对你有一定的参考价值。
使用python日志记录时,我得到重复(双)日志。我有3个文件:
1. main.py
2. dependencies.py
3. resources.py
我只调用了一个python logger构造函数,它在main.py中完成
以下是我在3个文件中的import语句
卖弄.朋友
import xml.etree.ElementTree as et
from configparser import ConfigParser
from Craftlogger import Craftlogger
logger = Craftlogger().getLogger()
dependencies.朋友
import os,sys
from main import getJobDetails,postRequest,logger
from configparser import ConfigParser
resources.朋友
import os,sys
import xml.etree.ElementTree as et
在main.py的main方法中,我有导入
def main():
from resources import getResourceDetails,setResources
from dependencies import setDependencies
..... Remaining code .....
我的日志文件看起来像这样
import logging
class Craftlogger:
def __init__(self):
self.logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
formatter_string = '%(asctime)s | %(levelname)-8s | %(filename)s-%(funcName)s-%(lineno)04d | %(message)s'
formatter = logging.Formatter(formatter_string)
handler.setFormatter(formatter)
self.logger.addHandler(handler)
self.logger.setLevel(logging.DEBUG)
self.logger.propagate = False
def getLogger(self):
return self.logger
注意:我必须在main内部进行导入,以便能够进行循环导入。
答案
我的猜测是存在两个CraftLogger
对象并且都具有相同的self.logger
成员。 logging.getLogger(__name__)
可能为另一个CraftLogger
对象返回相同的对象,导致在同一记录器上进行两次addHandler
调用。这只是猜测,不能保证。
另一答案
记录是一个跨领域的问题。因此,我对自己设置日志记录的课程不屑一顾。配置日志记录(尤其是处理程序)的责任应该仅与主执行功能有关,例如你的主要功能。除了通过logging.getlogger(name)获取记录器之外,没有子模块/类/函数应该修改日志记录。这避免了大多数这些陷阱并且允许容易地组合模块。想象一下,你必须导入两个修改日志记录系统的模块......好玩
以上是关于在python logger中获取双重日志 - 代码具有循环依赖性的主要内容,如果未能解决你的问题,请参考以下文章