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 目标、收集和整合反馈,并有足够可用时间有效完成此任务的倡导者。
基本原理
在某些情况下,输出到stdout或stderr是不切实际的
- 守护进程应用程序中,框架不允许将标准输出重定向到某些文件,而是假定使用其他形式的日志记录。示例包括 *nix 下的 syslog 和 WinNT+ 下的 EventLog。
- GUI应用程序希望将每个新的日志条目输出到单独的弹出窗口中(即淡入淡出的OSD)。
此外,有时应用程序希望根据其来源或严重性过滤输出条目。此要求无法通过简单的重定向实现。
最后,有时输出需要用事件时间戳进行标记,这使用日志系统可以轻松实现。
提案
所有可用于守护进程和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
最后修改时间:2025-02-01 08:59:27 GMT