为不同模块定义和配置的单独记录器,并多次获取消息

时间:2017-11-17 06:00:36

标签: python logging

我有两个类,它们都有自己的记录器(已定义和配置)。所有记录器中唯一常见的是它们正在登录同一个文件。所有记录器都在类的 init 方法中定义和配置。这与我正在做的事情类似

class One:

def __init__(self):
    pass

def set_params(self):
    log_file_name  = r"C:\Users\Sample\SamplePath\SampleLogs.log"
    log_format = "%(name)s :  %(levelname)s :  %(asctime)s : [%(filename)s] : [%(funcName)s] : %(message)s"
    three = Three(log_file_name, log_format)
    self.param = [log_file_name, log_format, three]

def get_param(self):
    return self.param

这是设置log_file的父类log_format。

然后有一个第三类,它在第一类

中被实例化
class Three:
def __init__(self, log_file_name, log_format):
    self.logger = logging.getLogger(__name__)
    self.logger.setLevel(logging.DEBUG)
    file_handler = logging.FileHandler(log_file_name)
    formatter = logging.Formatter(log_format)
    file_handler.setFormatter(formatter)
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.INFO)
    self.logger.addHandler(file_handler)
    self.logger.addHandler(stream_handler)

def sample_method(self):
    self.logger.info("Sample Method called")

第三类的对象正用于第二类(它还有自己的记录器)

class Two:
def __init__(self, log_file_name, log_format, class_three_object):
    self.logger = logging.getLogger(__name__)
    self.logger.setLevel(logging.DEBUG)
    file_handler = logging.FileHandler(log_file_name)
    formatter = logging.Formatter(log_format)
    file_handler.setFormatter(formatter)
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.INFO)
    self.logger.addHandler(file_handler)
    self.logger.addHandler(stream_handler)

    class_three_object.sampleMethod()

最后,用于调用的主要方法是

def main():
first = One()
params = first.get_param()
second = Two(params[0], params[1], params[2])

这三个类都在不同的模块中。我知道当我们将处理程序附加到记录器及其祖先时,Python会多次记录。但如果每个类都有自己的记录器,它应该发生吗? 我认为如果实例化第三类两次可能是可能的。因此,我将它实例化一次并将其作为对象传递给第二类,但事实证明这是我的一个直截了当的猜测。 有人可以帮我这个吗? 谢谢

编辑1:所有类都在三个不同的文件中。当 name ==“ main

时,在包含第二个类的文件中调用main()函数

0 个答案:

没有答案