Подключение к серверу gremlin из python API дублирует сообщения журнала

#python-3.x #logging #gremlin #tinkerpop3

#python-3.x #ведение журнала #gremlin #tinkerpop3

Вопрос:

После подключения к серверу Gremlin все мои сообщения журнала дублируются. Я использую следующий код для подключения.

 graph = anonymous_traversal.traversal().withRemote(DriverRemoteConnection("ws://localhost:8182/gremlin", "g"))
 

Я предполагаю, что API gremlin-python каким-то образом включает корневой регистратор, но я не могу найти его где. Возможно, я пропустил некоторые настройки. Любые советы по преодолению этой проблемы приветствуются.

Вот весь пример кода, который я использовал для воспроизведения этой проблемы.

 import logging

from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
from gremlin_python.process import anonymous_traversal
 

Я использовал это для тестирования в качестве основной точки входа скрипта.

 if __name__ == '__main__':
 

Настройка моего локального экземпляра регистратора

     logger = logging.getLogger(__name__)
    logger.setLevel(logging.getLevelName('DEBUG'))

    log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')

    log_file_handler = logging.FileHandler('foo.log', mode='w')
    log_file_handler.setFormatter(log_format)
    log_file_handler.setLevel(logging.DEBUG)
    logger.addHandler(log_file_handler)

    console_log_handler = logging.StreamHandler()
    console_log_handler.setLevel(logging.getLevelName('INFO'))
    console_log_handler.setFormatter(log_format)
    logger.addHandler(console_log_handler)
 

И отправка некоторых сообщений в журнал до установления соединения.

     logger.debug("foo")
    logger.info("foo")
    logger.warning("and")
    logger.error("foo again")
 

Прокомментируйте / раскомментируйте следующую строку для тестирования без подключения к gremlin

     graph = anonymous_traversal.traversal().withRemote(DriverRemoteConnection("ws://localhost:8182/gremlin", "g"))
 

Наконец, отправка еще одного сообщения после подключения.

     logger.debug("after foo")
    logger.info("after foo")
    logger.warning("after and")
    logger.error("after foo again")
 

Результат выглядит примерно так.

 2019-04-18 16:09:57,746 - INFO - foo
2019-04-18 16:09:57,746 - WARNING - and
2019-04-18 16:09:57,746 - ERROR - foo again
DEBUG:__main__:after foo
2019-04-18 16:09:59,107 - INFO - after foo
INFO:__main__:after foo
2019-04-18 16:09:59,107 - WARNING - after and
WARNING:__main__:after and
2019-04-18 16:09:59,108 - ERROR - after foo again
ERROR:__main__:after foo again
 

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

Ответ №1:

Я нашел очень простой обходной путь. Это некрасиво.

 def non_root_logger():
    for handler in logging.root.handlers:
        logging.root.removeHandler(handler)
    return logging.getLogger(__name__)