Twisted 的传统日志系统:twisted.python.log
¶
注意
Twisted 中现在有一个新的日志系统 (您可以在这里了解如何使用它 以及 its API reference here
),它取代了 twisted.python.log
.
这里描述的旧日志 API 为了兼容性而保留,现在作为新日志系统的客户端实现。
新代码应该采用新的 API。
基本用法¶
Twisted 在 twisted.python.log
模块中提供了一个简单灵活的日志系统。它有三个常用的函数
记录一条新消息。例如
from twisted.python import log log.msg('Hello, world.')
将错误写入日志,包括跟踪信息(如果有)。您可以传递一个
Failure
或 Exception 实例,或者什么都不传递。如果您传递其他内容,它将使用repr
转换为字符串并记录。如果您不传递任何内容,它将从当前活动的异常构造一个 Failure,这使得它在
except
子句中使用起来很方便try: x = 1 / 0 except BaseException: log.err() # will log the ZeroDivisionError
开始将日志记录到给定的类文件对象。例如
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.stdout
和sys.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 中日志观察者的一个例子是 FileLogObserver
的 emit
方法。FileLogObserver
(由 startLogging
使用)将事件写入日志文件。日志观察者只是一个可调用对象,它接受一个字典作为其唯一参数。然后,您可以注册它以接收所有日志事件(除了任何其他观察者)
twisted.python.log.addObserver(yourCallable)
该字典将至少包含两个项目
message
此日志事件的消息(一个列表,通常是字符串),如传递给
log.msg
或传递给log.err
的错误中的消息。
isError
这是一个布尔值,如果此事件来自对
log.err
的调用,则为真。如果设置了此值,则字典中可能还会有一个failure
项目,其中包含一个 Failure 对象。
内置日志记录功能可能添加的其他项目包括
printed
此消息是从
sys.stdout
捕获的,即此消息来自isError
也为真,则它来自sys.stderr
。
您可以通过将关键字参数传递给 log.msg
和 log.err
,将其他项目传递给事件字典。标准日志观察者将忽略他们不使用的字典项目。
重要说明
永远不要在日志观察器中阻塞,因为它可能在主 Twisted 线程中运行。这意味着您不能使用套接字或 syslog 标准库日志记录后端。
如果您预计在程序中使用线程,则观察器需要是线程安全的。
自定义 twistd
日志记录¶
可以使用 --logger
选项或在应用程序对象上设置 ILogObserver
组件来自定义 twistd
执行的日志记录行为。有关更多信息,请参阅 应用程序文档。