访问日志

既然我们正在讨论日志记录,现在可能是提到 Twisted Web 的访问日志支持的好时机。在本例中,我们将看到 Twisted Web 为其处理的每个请求记录的内容以及如何自定义它。

如果您运行了任何之前的示例并观察了twistd 的输出或读取了twistd.log,那么您已经看到了一些类似于此的日志行

2014-01-29 17:50:50-0500 [HTTPChannel,0,127.0.0.1] “127.0.0.1” - - [29/Jan/2014:22:50:50 +0000] “GET / HTTP/1.1” 200 2753 “-” “Mozilla/5.0 …”

如果您关注此日志消息的后半部分,您将看到类似于标准“组合日志格式”消息的内容。但是,它以正常的 Twisted 日志记录前缀为前缀,提供时间戳以及一些协议和对等地址信息。其中大部分信息是冗余的,因为它属于组合日志格式。 Site 允许您生成更紧凑的日志,该日志省略了正常的 Twisted 日志记录前缀。要利用此功能,只需告诉 Site 在哪里写入此紧凑日志即可。通过将logPath 传递给初始化器来实现这一点

...
factory = Site(root, logPath=b"/tmp/access-logging-demo.log")

或者,如果您想更改使用twistd web 启动的服务器的日志记录行为,只需传递--logfile 选项即可

$ twistd -n web --logfile /tmp/access-logging-demo.log

除此之外,服务器的其余设置相同。一旦您传递了logPath 或在命令行上使用了--logfile,服务器将生成一个包含以下内容的日志文件

“127.0.0.1” - - [30/Jan/2014:00:13:35 +0000] “GET / HTTP/1.1” 200 2753 “-” “Mozilla/5.0 …”

任何期望组合日志格式消息的工具都应该能够使用这些日志文件。

Site 还允许使用其logFormatter 参数自定义使用的日志格式。Twisted Web 带有一个备用格式化程序,proxiedLogFormatter,它用于代理后面,该代理设置X-Forwarded-For 标头。它记录从该标头获取的客户端地址,而不是直接连接到服务器的客户端的网络地址。以下是一个使用这两个功能的示例的完整代码

from twisted.web.http import proxiedLogFormatter
from twisted.web.server import Site
from twisted.web.static import File
from twisted.internet import reactor, endpoints

resource = File('/tmp')
factory = Site(resource, logPath=b"/tmp/access-logging-demo.log", logFormatter=proxiedLogFormatter)
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8888)
endpoint.listen(factory)
reactor.run()