访问日志¶
既然我们正在讨论日志记录,现在可能是提到 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()