Twisted 的传统日志系统:twisted.python.log

注意

Twisted 中现在有一个新的日志系统 (您可以在这里了解如何使用它 以及 its API reference here),它取代了 twisted.python.log.

这里描述的旧日志 API 为了兼容性而保留,现在作为新日志系统的客户端实现。

新代码应该采用新的 API。

基本用法

Twisted 在 twisted.python.log 模块中提供了一个简单灵活的日志系统。它有三个常用的函数

msg

记录一条新消息。例如

from twisted.python import log
log.msg('Hello, world.')

err

将错误写入日志,包括跟踪信息(如果有)。您可以传递一个 Failure 或 Exception 实例,或者什么都不传递。如果您传递其他内容,它将使用 repr 转换为字符串并记录。

如果您不传递任何内容,它将从当前活动的异常构造一个 Failure,这使得它在 except 子句中使用起来很方便

try:
    x = 1 / 0
except BaseException:
    log.err()   # will log the ZeroDivisionError

startLogging

开始将日志记录到给定的类文件对象。例如

log.startLogging(open('/var/log/foo.log', 'w'))

或者

log.startLogging(sys.stdout)

或者

from twisted.python.logfile import DailyLogFile

log.startLogging(DailyLogFile.fromFullPath("/var/log/foo.log"))

默认情况下,startLogging 还会将写入 sys.stdoutsys.stderr 的任何内容重定向到日志。您可以通过将 setStdout=False 传递给 startLogging 来禁用此功能。

在调用 startLogging 之前,日志消息将被丢弃,错误将被写入 stderr。

日志记录和 twistd

如果您使用 twistd 运行您的守护进程,它将为您处理调用 startLogging,并且还会轮换日志文件。有关使用 twistd 的详细信息,请参阅 twistd 和 tac 以及 twistd 手册页。

日志文件

twisted.python.logfile 模块提供了一些适合与 startLogging 一起使用的标准类,例如 DailyLogFile,它每天会将日志轮换到一个新的文件。

使用标准库日志记录模块

如果您的应用程序使用 Python 标准库日志记录模块,或者您想使用它简单的配置,但不想丢失 Twisted 生成的消息,观察者 PythonLoggingObserver 对您来说应该很有用。

您只需像其他任何观察者一样启动它

observer = log.PythonLoggingObserver()
observer.start()

然后 配置标准库日志记录模块 以符合您的预期。

此方法允许您使用 logLevel 关键字自定义标准库日志记录模块接收的日志级别

log.msg("This is important!", logLevel=logging.CRITICAL)
log.msg("Don't mind", logLevel=logging.DEBUG)

除非提供 logLevel,否则 logging.INFO 用于 log.msg,而 logging.ERROR 用于 log.err

当您使用标准库日志记录模块的特殊配置时,需要注意一点:某些处理程序(例如 SMTP、HTTP)使用网络,因此可能会在 Reactor 循环中阻塞。PythonLoggingObserver 中,没有采取任何措施来防止这种情况。

编写日志观察者

日志观察者是 Twisted 日志系统的基础。每当调用 log.msg(或 log.err)时,都会发出一个事件。该事件将传递给已注册的每个观察者。可以有任意数量的观察者,每个观察者都可以以任何想要的方式处理该事件。Twisted 中日志观察者的一个例子是 FileLogObserveremit 方法。FileLogObserver(由 startLogging 使用)将事件写入日志文件。日志观察者只是一个可调用对象,它接受一个字典作为其唯一参数。然后,您可以注册它以接收所有日志事件(除了任何其他观察者)

twisted.python.log.addObserver(yourCallable)

该字典将至少包含两个项目

message

此日志事件的消息(一个列表,通常是字符串),如传递给 log.msg 或传递给 log.err 的错误中的消息。

isError

这是一个布尔值,如果此事件来自对 log.err 的调用,则为真。如果设置了此值,则字典中可能还会有一个 failure 项目,其中包含一个 Failure 对象。

内置日志记录功能可能添加的其他项目包括

printed

此消息是从 sys.stdout 捕获的,即此消息来自 print 语句。如果 isError 也为真,则它来自 sys.stderr

您可以通过将关键字参数传递给 log.msglog.err,将其他项目传递给事件字典。标准日志观察者将忽略他们不使用的字典项目。

重要说明

  • 永远不要在日志观察器中阻塞,因为它可能在主 Twisted 线程中运行。这意味着您不能使用套接字或 syslog 标准库日志记录后端。

  • 如果您预计在程序中使用线程,则观察器需要是线程安全的。

自定义 twistd 日志记录

可以使用 --logger 选项或在应用程序对象上设置 ILogObserver 组件来自定义 twistd 执行的日志记录行为。有关更多信息,请参阅 应用程序文档