Varnish:是否可以记录所有 GET 请求以进行进一步处理?

Varnish: Is it possible to log all GET requests for further processing?

是否可以使用 Varnish 来完成以下任务?

想象一个 URL(例如 /vote?poll-id=1&answer-id=2)是通过直接链接请求的,我们会在其中显示所选 poll-id 的投票结果。

我想save/pull/process所有请求URL(几乎实时)生成这些民意调查结果。

是否可以将那些 URL 作为某种流进行进一步处理?

之所以使用varnish是因为我想减少较慢的上游后端服务的负载。并且因为显示实际结果的一些延迟是可以的。

清漆有 built-in shared memory logs。这些可以使用各种工具进行查询。

可能对您有用的主要内容是:

  • varnishlog:in-depth 记录请求、响应和内部处理的各个方面
  • varnishncsa:一个 Apache/NCSA 风格的日志记录工具

您还可以利用 VCL 编程语言并将 VCL 中的请求记录到操作系统的 syslog 机制。

清漆日志

以下命令将显示以 /vote 开头的 URL 的所有日志记录信息:

varnishlog -g request -q "ReqUrl ~ '^/vote'"

您可以筛选出您需要的字段:

varnishlog -i requrl -i reqheader -g request -q "ReqUrl ~ '^/vote'"

这个只会显示请求URL和所有请求headers。

您还可以将输出写入文件:

varnishlog -A -a -w /var/log/varnish/vsl_vote.log -i requrl -i reqheader -g request -q "ReqUrl ~ '^/vote'"

请参阅 http://varnish-cache.org/docs/6.5/reference/varnishlog.html to learn more about varnishlog and http://varnish-cache.org/docs/6.5/reference/vsl-query.html 以了解有关 vsl-query 语言的更多信息。

清漆

如果你想Apache-style记录日志,你可以使用下面的命令:

varnishncsa -g request -q "ReqUrl ~ '^/vote'"

您还可以将这些日志写入日志文件:

varnishncsa -a -w /var/log/varnish/vote_access.log -g request -q "ReqUrl ~ '^/vote'"

Both varnishncsa and varnishlog binaries can be daemonized using the -D parameter

请参阅 http://varnish-cache.org/docs/6.5/reference/varnishncsa.html 以了解有关 varnishncsa 的更多信息。文档中还有一个部分是关于将自定义字段包含在 varnishncsa 输出中。

系统日志来自 VCL

如果您使用以下代码段,您可以将投票请求记录到 syslog:

vcl 4.1;
import std;

sub vcl_recv {
    if(req.url ~ "^/vote") {
        std.syslog(6, "Vote request captured: " + req.url);
    } 
}

This is boilerplate VCL that cannot just be copy/pasted like that. Please make sure to add import std; to your VCL file, and use std.syslog() to log to your local syslog facility.

请参阅 http://varnish-cache.org/docs/6.5/reference/vmod_std.html#void-syslog-int-priority-string-s 以了解有关 std.syslog() 的更多信息。