使用python日志记录时,我得到重复的日志(双记录)。我有3个文件:
1. main.py
2. dependencies.py
3. resources.py
我仅对main.py内部完成的python logger构造函数进行一次调用
以下是我在3个文件中的导入语句
main.py
import xml.etree.ElementTree as et
from configparser import ConfigParser
from Craftlogger import Craftlogger
logger = Craftlogger().getLogger()
dependencies.py
import os,sys
from main import getJobDetails,postRequest,logger
from configparser import ConfigParser
resources.py
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内部进行导入,以便能够进行循环导入。
答案 0 :(得分:0)
我的猜测是存在两个CraftLogger
对象,并且它们都具有相同的self.logger
成员。 logging.getLogger(__name__)
可能会为另一个CraftLogger
对象返回相同的对象,从而导致在同一记录器上进行两次addHandler
调用。这只是猜测,不能保证。
答案 1 :(得分:0)
记录是一个跨领域的问题。因此,我不赞成自己设置日志的类。配置日志记录(尤其是处理程序)的责任应完全由主要执行功能负责,例如您的主要功能。除了通过logging.getlogger( name )获取记录器外,任何子模块/类/函数都不应修改记录。 这样可以避免大多数此类陷阱,并可以轻松组成模块。 假设您必须导入两个都修改日志记录系统的模块...乐趣