7

我目前正在开发pyftpdlib模块的 1.0.0 版本。这个新版本将引入一些向后不兼容的更改,因为某些 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 的一部分公开和整合的地方获取线索吗?

提前致谢。

4

4 回答 4

3

库(ftp 服务器或客户端库)不应该初始化日志系统。所以可以实例化一个记录器对象并在文档中指向 logging.basicConfig (或者提供一个具有更高级输出的 basicConfig 函数,让用户在他的日志配置策略、普通 basicConfig 或库提供的配置中进行选择)

框架(例如 django)或服务器(ftp 服务器守护程序)应将日志系统初始化为合理的默认值,并允许自定义日志系统配置。

于 2012-05-21T08:09:01.807 回答
2

通常库应该只创建一个NullHandler处理程序,它只是一个什么都不做的处理程序。然后,使用您的库的最终用户或应用程序开发人员可以配置日志记录系统。有关详细信息,请参阅文档中的为库配置日志记录部分。logging特别是,请参阅开头的注释

强烈建议您不要添加除NullHandler库记录器之外的任何处理程序。

在您的情况下,我将根据日志记录文档简单地创建一个日志记录处理程序,

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

编辑问题中概述的日志记录实现似乎完全合理。在您的文档中,只需提及logger并讨论或指向用户自定义库输出的logging.setLevel方法logging.setFormatterlogging.basicConfig(format=FORMAT)您可以考虑使用logging.config.fileConfig来管理输出设置并在文档中的某处记录配置文件,而不是使用它,再次将用户指向该文件中预期格式的日志记录模块文档。

于 2012-05-21T08:46:50.030 回答
0

这是我用来制作可定制记录器的资源。我没有做太多改变,我只是添加了一个 if 语句,并传入我是要登录到文件还是只是控制台。

检查这个着色器。对输出进行着色非常好,因此 DEBUG 看起来与 WARN 不同,而 WARN 看起来与 INFO 不同。

Logging 模块捆绑了许多不错的功能,例如 SMTP 日志记录、文件轮换日志记录(因此您可以保存几个旧的日志文件,但每次出现问题时都不会创建 100 个)。

如果您想迁移到 Python 3,使用日志记录模块将无需更改打印语句。

日志记录很棒,具体取决于您在做什么,我之前只是轻轻地使用它来查看我在程序中的位置(如果您正在运行此功能,请以这种方式着色),但它比常规功能强大得多打印声明。

于 2012-05-21T02:56:10.267 回答
0

您可以查看 Django(只需创建一个示例项目)并查看它如何初始化记录器子系统。

还有一个我前段时间写过的上下文记录器助手——这个记录器自动获取模块/类/函数的名称,是从中初始化的。这对于调试消息非常有用,您可以直接看到该模块吐出消息以及调用流程如何进行。

于 2012-05-21T07:02:33.250 回答