2012-05-20 4 views
7

В настоящее время я работаю над выпуском 1.0.0 модуля pyftpdlib. Эта новая версия представит некоторые несовместимые изменения в , что некоторые API-интерфейсы больше не будут принимать байты, а unicode. Пока я нахожусь в этом брекетинге, я рассматривал возможность отказаться от моих функций регистрации, которые в настоящее время используют оператор печати , и вместо этого использовать модуль протоколирования.Преимущества ведения журнала и печати() + лучшие методы ведения журналов

Как прямо сейчас pyftpdlib делегаты протоколирование 3 функции:

def log(s): 
    """Log messages intended for the end user.""" 
    print s 

def logline(s): 
    """Log commands and responses passing through the command channel.""" 
    print s 

def logerror(s): 
    """Log traceback outputs occurring in case of errors.""" 
    print >> sys.stderr, s 

Пользователь готовы настроить журналы (например, записать их в файл) должен просто переписать эти 3 функции, как в:

>>> from pyftpdlib import ftpserver 
>>> 
>>> def log2file(s): 
...  open('ftpd.log', 'a').write(s) 
... 
>>> ftpserver.log = ftpserver.logline = ftpserver.logerror = log2file 

Теперь я задаюсь вопросом: какие выгоды означало бы избавиться от этого подхода и использовать модуль ведения журнала, а? С точки зрения поставщика модулей, как именно я должен раскрывать функции регистрации в моем модуле? Я должен сделать это:

import logging 
logger = logging.getLogger("pyftpdlib") 

... и состояние в моем документе, что «Регистратор» является объект, который, как предполагается, будет использоваться в случае, если пользователь хочет, чтобы настроить, как журналы ведут себя? Является ли правомерным намеренно предопределенный формат вывод, как в:

FORMAT = '[%(asctime)] %(message)s' 
logging.basicConfig(format=FORMAT) 
logger = logging.getLogger('pyftpdlib') 

...?

Можете ли вы подумать о стороннем модуле, я могу понять, откуда функционирует функция ведения журнала и консолидируется как часть общедоступного API?

Заранее спасибо.

ответ

0

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

Отметить this Colorer out. Это очень приятно для раскраски вывода, поэтому DEBUG выглядит иначе, чем WARN, который выглядит иначе, чем INFO.

Модуль протоколирования связывает множество хороших функций, таких как ведение журнала SMTP, ведение журнала вращения файлов (так что вы можете сохранить пару старых файлов журналов, но не делать их 100 раз каждый раз, когда что-то пойдет не так).

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

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

0

Вы можете посмотреть Django (просто создать образец проекта) и посмотреть, как он инициализирует подсистему регистрации.

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

3

библиотеки (ftp-сервер или клиентская библиотека) никогда не должны инициализировать систему ведения журнала. Итак, это нормально, чтобы создать экземпляр объекта регистратора и указать на logging.basicConfig в документации (или предоставить функцию по строкам basicConfig с выходом fancier и позволить пользователю выбрать одну из его стратегий конфигурации ведения журнала, обычную базовую библиотекуConfig или при условии конфигурации)

рамки (например, Джанго) или сервера (FTP-сервере-демоне) должна инициализировать систему протоколирования разумного по умолчанию и позволяет для настройки конфигурации системы регистрации.

2

Обычно библиотеки должны просто создавать обработчик NullHandler, который просто обработчик ничего не делает. Разработчик конечных пользователей или приложений, который использует вашу библиотеку, может затем настроить систему ведения журнала. Дополнительную информацию см. В разделе Configuring Logging for a Library в документации logging. В частности, см. Примечание, которое начинается

Настоятельно рекомендуется не добавлять никаких обработчиков, кроме NullHandler, регистраторам вашей библиотеки.

В вашем случае я бы просто создать обработчик протоколирования, согласно документации, лесозаготовительной,

import logging 
logging.getLogger('pyftpdlib').addHandler(logging.NullHandler()) 

Edit Реализация протоколирования набросал в вопросе представляется вполне разумным. В своей документации просто укажите logger и обсудите или укажите пользователей на методы logging.setLevel и logging.setFormatter для настройки вывода из вашей библиотеки. Вместо использования logging.basicConfig(format=FORMAT) вы можете использовать logging.config.fileConfig для управления настройками вашего вывода и документировать конфигурационный файл где-нибудь в своей документации, снова указав пользователю документацию протокола протоколирования для формата, ожидаемого в этом файле.

+0

Означает ли это, что по умолчанию не будет производиться выход? В этом случае я не доволен этим. –

+0

По умолчанию этот вывод не выводит. Кроме того, 'logging.NullHandler' доступен только в Python 2.7 (и> 3.2, я думаю), что может быть проблемой. Если вы просто используете 'logger = logging.getLogger ('pyftpdlib')', вы получите сообщения по умолчанию, и вы можете просто указать своих пользователей в документацию 'logging.setLevel' и' logging.setFormatter', чтобы продемонстрировать, как настроить вывод сообщений для вашей библиотеки. Кроме того, вы можете использовать конфигурацию файла ['logging.config.fileConfig'] (http://docs.python.org/dev/library/logging.config.html#logging.config.fileConfig), чтобы разрешить пользователям настраивать logger – Chris

+0

Кроме того, чтобы ответить на один из ваших исходных вопросов, преимущества использования протоколов, а не заявлений на печать кратко упоминаются в [PEP 282] (http://www.python.org/dev/peps/pep-0282/): * Если в стандартной библиотеке закреплен один механизм регистрации, 1) ведение журнала, скорее всего, будет выполнено «хорошо», и 2) несколько библиотек смогут быть интегрированы в более крупные приложения, которые могут быть зарегистрированы с достаточной степенью согласованности. * – Chris

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