2015-08-26 3 views
0

Я пытаюсь настроить некоторые протоколирования, и у меня возникает проблема. Всякий раз, когда дочерний класс использует функцию родительского класса, вместо имени регистратора дочернего класса используется имя регистратора функции родительского класса.Использовать родительский класс Имя регистратора дочернего класса

Скажем, у меня есть следующие два класса:

Родитель Класс:

import logging 
logger = logging.getLogger('ParentClass') 

class ParentClass: 
    def __init___(self): 
     logger.info('This is inside ParentClass') 

Детский Класс:

import logging 
logger = logging.getLogger('ChildClass') 

class ChildClass(ParentClass): 
    def foo(self): 
     logger.info('This is inside ChildClass') 

Затем я запускаю следующий сценарий:

import logging 
import ParentClass 
import ChildClass 

# Pretend I set up logging to "example.log" 
foo1 = ParentClass.ParentClass() 
foo2 = ChildClass.ChildClass() 
foo2.foo() 

Мой журнал файл заканчивает тем, как:

INFO:ParentClass:This is inside ParentClass #(<-- this comes from foo1 init) 
INFO:ParentClass:This is inside ParentClass #(<-- this comes from foo2 init) 
INFO:ChildClass:This is inside ChildClass #(<-- this comes from foo2 foo) 

Что я ищу это __init__ призыв ChildClass войти под ChildClass регистратора, как это:

INFO:ParentClass:This is inside ParentClass #(<-- this comes from foo1 init) 
INFO:ChildClass:This is inside ParentClass #(<-- this comes from foo2 init) 
INFO:ChildClass:This is inside ChildClass #(<-- this comes from foo2 foo) 

есть в любом случае сделать это без прохождения имя регистратора, которое я хочу использовать в ParentClass?

+0

Так что я должен установить \ __ init__ у ребенка класс, а затем явно называть это так? __edit__ Этот подход не работает, и я все равно получаю тот же результат в файле журнала. – RNikoopour

ответ

3

Каждый из ваших классов использует свой собственный регистратор для своего собственного кода, потому что вы обращаетесь к логгер через глобальную переменную в каждой из ваших двух модулей. Если вы хотите, чтобы регистратор привязанную к классам вместо модулей, попробуйте сделать это переменная класса, и доступ к нему через self:

class ParentClass: 
    logger = logging.getLogger('ParentClass') # class variable 
    def __init___(self): 
     self.logger.info('This is inside ParentClass') 

class ChildClass(ParentClass): 
    logger = logging.getLogger('ChildClass') # override parent class variable 
    def foo(self): 
     self.logger.info('This is inside ChildClass') 
+0

Больной! – RNikoopour

+0

Кроме того, я благодарю вас за объяснение ответа! – RNikoopour

1

Вам нужно сделать logger атрибут классов. Как теперь обстоят дела, ParentClass может только вызывать логгер, определенный в его модуле: он не имеет доступа к регистратору в ChildClass (если только модуль ParentClass не импортирует ChildClass и явно вызывает ChildClass.logger).

Вместо этого для модуля ParentClass:

import logging 

class ParentClass: 
    logger = logging.getLogger('ParentClass') 

    def __init___(self): 
     self.logger.info('This is inside ParentClass') 

и это для ChildClass:

import logging 
import ParentClass # I assume you do this, too 

class ChildClass(ParentClass): 
    logger = logging.getLogger('ChildClass') 

    def foo(self): 
     self.logger.info('This is inside ChildClass') 
1

Опираясь на пост sureshvv, я считаю полезным поставить это в __init__ метод моего родительский класс:

self.log = logging.getLogger(self.__class__.__name__) 

Затем дочерние классы могут регистрироваться с использованием self.log и имеет %(name)s маркер в формате лог правильно отобразить имя класса ребенка, а не имя класса родителя (который является то, что происходит, если вы передаете __name__ к getLogger().)

Смежные вопросы