Как настроить все регистраторы в приложении - PullRequest
13 голосов
/ 25 марта 2012

Модуль журналирования Python позволяет модулям или классам определять свои собственные регистраторы.И разные регистраторы могут иметь разные обработчики.Некоторые из них могут выбрать для входа в файл, в то время как другие для входа, скажем, в stdout.

Теперь мое приложение использует несколько таких модулей, каждый из которых имеет свои собственные регистраторы, которые имеют различные обработчики.Могу ли я унифицировать поведение ведения журнала, чтобы все журналы попадали в указанный мной файл журнала?Другими словами, есть ли способ .config () обработчики всех регистраторов одновременно, из одного места?

Ответы [ 2 ]

15 голосов
/ 25 марта 2012

Вам, вероятно, стоит заглянуть в Python Logging HOWTO , чтобы понять, как он работает.

Короче говоря, все, что обычно делают модули, это получение регистратора в форме G_LOG = logging.getLogger('package.name') и отправкасообщения для регистратора: G_LOG.info('some message'), G_LOG.exception('something bad happened').Модули обычно не должны ничего настраивать.

Приложение, использующее модули, может включить регистрацию и настроить обработчики на основе имен регистратора:

  • прослушивание всех сообщений или
  • прослушивать только сообщения, превышающие определенный порог, или
  • прослушивать сообщения только от регистраторов, имя которых начинается с package, или
  • прослушивать сообщения только от регистраторов, имя которых начинается с package.name и т. д.

Самый простой способ - настроить ведение журнала через logging.basicConfig где-то в начале вашего приложения:

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)-8s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename=log_file, filemode='a')

Таким образом, вы будетезаписывать все сообщения журнала из всех модулей в log_file.

Если вам нужна более детальная стратегия ведения журнала (помещайте журналы от разных регистраторов в разные файлы или отправляйте трассировки стека в отдельный файл), лучшеопределить файл конфигурации регистрации и настроить ведение журнала, используя logging.config.dictConfig или logging.config.fileConfig.

PS Я обычно создаю два регистратораs в качестве переменных модуля:

G_LOG = logging.getLogger(__name__)
ST_LOG = logging.getLogger('stacktrace.' + __name__)

до G_LOG Я отправляю только однострочные сообщения.В ST_LOG я дублирую важные сообщения, используя ST_LOG.exception, который неявно имеет exc_info=True и записывает трассировку стека текущего исключения.

В начале приложения я загружаю конфигурацию, которая конфигурирует два регистратора (и дваобработчики файлов для них): тот, который получает сообщения, которые начинаются с stacktrace и имеет propagate=0 (то есть сообщения трассировки стека не видны вверху) и корневой регистратор, который обрабатывает остальные сообщения.Я не буду помещать сюда свои полные файлы конфигурации журнала, так как это полезная домашняя работа, чтобы понять, как все это работает.

0 голосов
/ 27 марта 2019

С Logging HOWTO :

Дочерние регистраторы распространяют сообщения вплоть до обработчиков, связанных с их регистраторами-предками.Из-за этого нет необходимости определять и настраивать обработчики для всех регистраторов, которые использует приложение.Достаточно настроить обработчики для регистратора верхнего уровня и создать дочерние регистраторы по мере необходимости.(Однако вы можете отключить распространение, установив для атрибута распространения регистратора значение False.)

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

import logging

root_handler = ...

root_logger = logging.getLogger()
root_logger.addHandler(root_handler)  # Will receive all log entries

# Meanwhile in a module...

import logging

logger = logging.getLogger(__name__)

logger.error(...)  # Will go to root_handler
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...