首页 > 解决方案 > 如何以 varnishncsa 客户端模式日志格式记录后端?

问题描述

我正在寻找一种方法来在日志输出中包含后端名称(由backendvcl 选项配置),请求被发送到(或从任何一种方式接收到的响应) 。varnishncsa

客户端模式下运行 varnishncsa 时,即记录前端请求/响应。

日志格式在这里:https ://varnish-cache.org/docs/trunk/reference/varnishncsa.html#format

我试图找到一个%{X}x可以满足此选项的“扩展变量”(),但到目前为止还没有运气。清漆版本是 6.x。

我是否需要为此设置自定义请求或响应标头以匹配?

标签: varnish

解决方案


您可以使用扩展变量来完成工作。

varnishncsa来自后端请求

这是我检索后端请求的后端名称的示例:

varnishncsa -b -F "%{VSL:BackendOpen[2]}x"

您需要的VSL 标记BackendOpen是可以在 中返回以下输出的标记varnishlog

-   BackendOpen    32 boot.bla 192.168.224.2 8080 192.168.224.3 53908

如您所见,后端名称是第二个字段,因此是BackendOpen[2]表达式。

varnishncsa来自客户请求

客户端线程中提示后端,但未打开。

如果要访问提示的后端,则需要访问req.backend_hint变量。您可以使用std.log()将此值记录为VCL_Log标签。

这是 VCL 示例:

vcl 4.0;
import std;

backend default {
  .host="1.2.3.4";
  .port="80";
}

sub vcl_recv {
  std.log("Backend: "+ req.backend_hint);
}

这是varnishncsa查找此值的命令:

varnishncsa -c -F "%{VSL:VCL_Log:Backend}x"

结论

当然,您仍然需要varnishncsa稍微调整您的命令以包含正确的字段并过滤正确的参数,但是这个应该有望回答您的问题。

您可以在客户端请求端或后端请求端查找后端名称。


推荐阅读