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