2016-01-08 1 views
2

Добрый день. Я пытаюсь решить проблему с протоколированием в Python. Я использую Python 3.5.1. У меня есть приложение, которое использует класс, импортированный из другого модуля. Я не могу включить его. Это простое представление:Python. Включить ведение журнала для экземпляра класса, импортированного из отдельного модуля

# test.py 
import logging 

from test_class import TestClass 


logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 
logger.addHandler(logging.FileHandler('test_log.log', mode='w')) 


if __name__ == '__main__': 
    logger.info('Importing class') 
    t = TestClass() 
    t.make_call() 
    t.make_another_call() 
    logger.info('End') 

# test_class.py 
import logging 


class TestClass(object): 

    def __init__(self): 
     self.logger = logging.getLogger('test_class.TestClass') 

    def make_call(self): 
     self.logger.info('Make a call') 

    def make_another_call(self): 
     self.logger.info('Make another call') 

Как вы видите, регистратор должен написал файл для строк (два из основного модуля, и два из класса А когда я открыть файл журнала, я вижу:.

.?
# test_log.log 
Importing class 
End 

Итак, два регистратора вызовов из класса не имеют эффекта Любая идея, почему это не работает заранее спасибо

ответ

2

от the docs:.

Несколько вызовов в getLogger() с тем же именем всегда будут возвращать ссылку на тот же объект Logger.

Это потенциально иерархическое значение, разделенное периодом, например foo.bar.baz (хотя оно также может быть просто простым foo, например). Регистраторы, которые находятся ниже в иерархическом списке, являются дочерними элементами регистраторов выше в списке. Например, с учетом регистратора с именем foo регистраторы с именами foo.bar, foo.bar.baz и foo.bam являются потомками foo. Иерархия имен регистратора аналогична иерархии пакетов Python и идентична ей, если вы организовываете регистраторы на основе каждого модуля, используя рекомендуемую конструкцию logging.getLogger(__name__). Это связано с тем, что в модуле __name__ является именем модуля в пространстве имен пакета Python.

Как вы звоните getLogger в вашем коде, вызов в test.py делается с __main__ и вызов в test_class.py делается с test_class, так что последний не является потомком первого.

Вместо этого, если при настройке обработчика вы делаете это на объекте, который вы получили от вызова getLogger() без аргумента, вы будете настраивать обработчик на корневом объекте регистрации, а все остальные вызовы на getLogger() будут дополнительно вниз по иерархии и будет использовать обработчик, который вы укажете.

Если вы хотите, чтобы имя пользователя, заданное для операторов ведения журнала, в главном модуле, вы можете просто вызвать getLogger после того, как вы настроили обработчик.

Например:

# Call getLogger with no args to set up the handler 
logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 
logger.addHandler(logging.FileHandler('test_log.log', mode='w')) 


if __name__ == '__main__': 
    # call getLogger again with a name to tag subsequent log statements 
    logger = logging.getLogger(__name__) 
    logger.info('Importing class') 
    t = TestClass() 
    t.make_call() 
    t.make_another_call() 
    logger.info('End') 
+1

Спасибо так много! Работайте как шарм. :-) – drjackild