Должен ли логгер быть аргументом или глобальной переменной? - PullRequest
0 голосов
/ 28 мая 2018

При чтении кода Python я обычно вижу одно из этих двух соглашений:

def something(logger):
  logger.info('doing something')

или:

LOGGER = logging.getLogger(__NAME__)
def something():
  LOGGER.info('doing something')

Имеет ли первое какое-либо преимущество, т.е. является поточно-ориентированным, в то время какдругого нет?Или это чисто стилистическая разница?

1 Ответ

0 голосов
/ 22 мая 2019

Используйте глобальный регистратор, если вы хотите фиксированный регистратор:

LOGGER = logging.getLogger('stuff.do')

# logger depends on what we are
def do_stuff(operation: Callable):
    LOGGER.info('will do stuff')
    operation()
    LOGGER.info('just did stuff')

do_stuff(add_things)
do_stuff(query_things)

Это обычно используется при регистрации общих операций в диагностических целях.Например, веб-сервер будет вести журнал создания и уничтожения потоков.

Используйте параметр регистратора, если хотите изменить регистратор:

# logger depends on what we do
def do_stuff(operation: Callable, logger: Logger):
    logger.info('will do stuff')
    operation()
    logger.info('just did stuff')

do_stuff(add_things, logging.getLogger('add'))
do_stuff(query_things, logging.getLogger('query'))

Это обычно используетсяпри регистрации настраиваемых операций для целей бухгалтерского учета.Например, веб-сервер будет регистрировать различных типов запросов и их результатов.


Какой из них использовать, зависит исключительно от того, зависит ли выбор регистратора от глобальных или локальных данных.

Если выбор регистратора может быть решен глобально, это позволяет избежать загрязнения сигнатур функций при прохождении регистратора.Это улучшает модульность, так как вы можете добавлять / удалять logging звонки без изменения другого кода.При использовании ведения журнала для поиска ошибок вы, вероятно, захотите добавить ведение журнала в сомнительные разделы кода и удалить его из проверенных.

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


Нет преимуществ в использовании во время выполнения или безопасности в использовании любого из этих подходов, кроме того, что избегают операций впередать вещи вокруг.Модуль logging спроектирован так, чтобы быть поточно-ориентированным:

Безопасность резьбы

Модуль каротажа предназначен для резьбы-безопасно без какой-либо специальной работы, которую должны выполнять его клиенты.Это достигается благодаря использованию потоковых замков;Существует одна блокировка для сериализации доступа к общим данным модуля, и каждый обработчик также создает блокировку для сериализации доступа к своему базовому вводу / выводу.

Это полностью эквивалентно созданию нового «экземпляра»одного и того же регистратора или создать псевдоним для того же регистратора:

>>> a = logging.getLogger('demo')
>>> b = a
>>> c = logging.getLogger('demo')
>>> a is b is c
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...