PEP 337 – 标准库中的日志记录使用
- 作者:
- Michael P. Dubner <dubnerm at mindless.com>
- 状态:
- 延期
- 类型:
- 标准跟踪
- 创建:
- 2004 年 10 月 2 日
- Python 版本:
- 2.5
- 历史记录:
- 2004 年 11 月 10 日
摘要
本 PEP 定义了在标准库中使用日志记录系统(PEP 282)的标准。
实现本 PEP 将简化守护程序应用程序的开发。另一方面,本 PEP 需要对大量标准模块进行轻微修改(以向后兼容的方式)。
实现本 PEP 后,可以使用以下过滤方案
logging.getLogger('py.BaseHTTPServer').setLevel(logging.FATAL)
PEP 延期
由于目前缺乏有兴趣推广 PEP 目标、收集和整合反馈,以及有足够时间有效地进行此操作的推动者,因此对本 PEP 中涵盖的概念的进一步探索已被延期。
基本原理
在某些情况下,输出到标准输出或标准错误是不切实际的
- 守护程序应用程序,其中框架不允许将标准输出重定向到某个文件,而是假设使用其他形式的日志记录。例如,*nix 系统上的 syslog 和 WinNT+ 上的 EventLog。
- GUI 应用程序希望在单独的弹出窗口(例如淡入淡出的屏幕显示)中输出每个新的日志条目。
此外,有时应用程序希望根据其来源或严重性过滤输出条目。这种需求无法通过简单的重定向实现。
最后,有时输出需要使用事件时间戳标记,这可以使用日志记录系统轻松完成。
提案
每个可用于守护程序和 GUI 应用程序的模块都应该被重写为使用日志记录系统,而不是使用 print
或 sys.stdout.write
。
每个修改后的模块的开头都应该包含类似以下的代码
import logging
_log = logging.getLogger('py.<module-name>')
所有包含在与 Python 一起分发的标准库中的模块(以及仅此类模块,无法验证)都必须使用 py.
的前缀 [2]。使用 _log
是故意的,因为我们不想自动导出它。对于仅在一个类中使用日志的模块,可以在类定义中创建一个记录器,如下所示
class XXX:
__log = logging.getLogger('py.<module-name>')
然后,该类可以创建访问方法来记录到此私有记录器。
因此,print
和 sys.std{out|err}.write
语句应该被替换为 _log.{debug|info}
,而 traceback.print_exception
应该被替换为 _log.exception
,有时也可以使用 _log.debug('...', exc_info=1)
。
模块列表
以下是一个(可能不完整)的需要重新编写模块列表
- asyncore (dispatcher.log, dispatcher.log_info)
- BaseHTTPServer (BaseHTTPRequestHandler.log_request, BaseHTTPRequestHandler.log_error, BaseHTTPRequestHandler.log_message)
- cgi(可能 - cgi.log 是否有人使用?)
- ftplib(如果 FTP.debugging)
- gopherlib (get_directory)
- httplib (HTTPResponse, HTTPConnection)
- ihooks (_Verbose)
- imaplib (IMAP4._mesg)
- mhlib (MH.error)
- nntplib (NNTP)
- pipes (Template.makepipeline)
- pkgutil (extend_path)
- platform (_syscmd_ver)
- poplib(如果 POP3._debugging)
- profile(如果 Profile.verbose)
- robotparser (_debug)
- smtplib(如果 SGMLParser.verbose)
- shlex(如果 shlex.debug)
- smtpd (SMTPChannel/PureProxy,其中 print >> DEBUGSTREAM)
- smtplib(如果 SMTP.debuglevel)
- SocketServer (BaseServer.handle_error)
- telnetlib(如果 Telnet.debuglevel)
- threading? (_Verbose._note, Thread.__bootstrap)
- timeit (Timer.print_exc)
- trace
- uu (decode)
此外,还有一些模块具有注释掉的调试输出,或者应该添加调试输出的模块。例如
- urllib
最后,可能某些模块应该扩展以提供更多调试信息。
可疑模块
这里列出了社区将提议添加到模块列表中的模块以及社区认为应该从模块列表中删除的模块。
- tabnanny (check)
日志记录使用指南
此外,我们可以向库模块的作者提供一些建议,以便他们都遵循相同的记录器命名格式。我建议非标准库模块应该使用以其完整名称命名的记录器,因此包“dummy”的子包“junk”中的模块“spam”将被命名为“dummy.junk.spam”,当然,同一个子包的 __init__
模块的记录器名称将是“dummy.junk”。
参考文献
版权
本文件已置于公有领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0337.rst