2013-07-22 5 views
2

Я использую logging.getLogging() таким образом, который не запрещен документацией, но напрямую не упоминается.Является ли журнал журнала logging.getLogger масштабируемым с множеством названных журналов?

Мои приложения обрабатывают файлы данных и сетевые соединения, иногда в потоках. Для того, чтобы определить строки логов для каждого соединения и/или файла данных, я делаю следующее:

data_file_name = "data_file_123.xml" 
logger = logging.getLogger(data_file_name) 
logger.info("This is logged.") 

2013-07-22 05:58:55,721 - data_file_123.xml - INFO - This is logged. 

Это работает очень хорошо:

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

Моя забота это из документации на http://docs.python.org/2/library/logging.html#logging.getLogger:

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

Как уничтожаются экземпляры регистратора? Разрушены ли они? После обработки миллиона файлов будет использоваться миллион имен экземпляров журнала, которые будут использоваться в памяти? Я настраиваю себя на утечку памяти, поскольку память заполняется этими старыми экземплярами журнала?

ответ

2

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

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

Как вы заявили, вы используете модуль logging для чего-то, что не является частью цели модуля, поэтому оно является субоптимальным решением.

Существует не публичный API, чтобы избавиться от кэшированных лесорубов, хотя вы можете очистить кэш, выполнив:

>>> root = logging.getLogger() 
>>> root.manager.loggerDict.clear() 

В loggerDict или manager атрибуты не описаны в официальной документации, хотя они явно не обозначены как _private.

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

+0

Спасибо, что очищает мои подозрения. Часть миллионов файлов не была преувеличением, поэтому мне нужно изменить это.Глядя снова на документы, есть страница о добавлении контекста. Любые мнения о LoggerAdapter? http://docs.python.org/2/howto/logging-cookbook.html#using-loggeradapters-to-impart-contextual-information Сохранение API протоколирования будет приятным, и это позволяет это без необходимости создавать собственные слой. – nOw2

+0

@ nOw2 Использование «LoggerAdapter» представляется подходящим. – Bakuriu

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