VSL

Varnish共享内存日志记录

手册部分:

7

OVERVIEW

本文档描述了所有Varnish共享内存日志记录标记的格式和内容。这些标记由Varnish附带的varnishlog(1)、varnishtop(1)等日志记录工具使用。

VSL标签

BackendClose-后端连接已关闭

在关闭后端连接时记录。

格式为::

%d %s %s [ %s ]
|  |  |    |
|  |  |    +- Optional reason
|  |  +------ "close" or "recycle"
|  +--------- Backend display name
+------------ Connection file descriptor
BackendOpen-打开的后端连接

在打开新的后端连接时记录。

格式为::

%d %s %s %s %s %s %s
|  |  |  |  |  |  |
|  |  |  |  |  |  +- "connect" or "reuse"
|  |  |  |  |  +---- Local port
|  |  |  |  +------- Local address
|  |  |  +---------- Remote port
|  |  +------------- Remote address
|  +---------------- Backend display name
+------------------- Connection file descriptor
Backend_Health-后端运行状况检查

后端运行状况探测的结果。

格式为::

%s %s %s %s %u %u %u %f %f %s
|  |  |  |  |  |  |  |  |  |
|  |  |  |  |  |  |  |  |  +- Probe HTTP response / error information
|  |  |  |  |  |  |  |  +---- Average response time
|  |  |  |  |  |  |  +------- Response time
|  |  |  |  |  |  +---------- Probe window size
|  |  |  |  |  +------------- Probe threshold level
|  |  |  |  +---------------- Number of good probes in window
|  |  |  +------------------- Probe window bits
|  |  +---------------------- "healthy" or "sick"
|  +------------------------- "Back", "Still" or "Went"
+---------------------------- Backend name

探测窗口位为::

'-': Could not connect
'4': Good IPv4
'6': Good IPv6
'U': Good UNIX
'x': Error Xmit
'X': Good Xmit
'r': Error Recv
'R': Good Recv
'H': Happy

当后端刚刚创建时,尚未运行的运行状况检查插槽的窗口位显示为‘-’,类似于连接失败。

Begin-标记VXID的开始

VXID事务的第一条记录。

格式为::

%s %d %s [%u]
|  |  |   |
|  |  |   +- Task sub-level
|  |  +----- Reason
|  +-------- Parent vxid
+----------- Type ("sess", "req" or "bereq")
BereqAcct-后端请求记账

包含来自后端请求处理的字节计数器。

格式为::

%d %d %d %d %d %d
|  |  |  |  |  |
|  |  |  |  |  +- Total bytes received
|  |  |  |  +---- Body bytes received
|  |  |  +------- Header bytes received
|  |  +---------- Total bytes transmitted
|  +------------- Body bytes transmitted
+---------------- Header bytes transmitted
BereqHeader-后端请求标头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

BereqMethod-后端请求方法

使用的HTTP请求方法。

BereqProtocol-后端请求协议

HTTP协议版本信息。

BereqURL-后端请求URL

HTTP请求URL。

BereqUnset-后端请求取消设置标头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

BerespHeader-后端响应头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

BerespProtocol-后端响应协议

HTTP协议版本信息。

BerespReason-后端响应原因

HTTP响应原因字符串。

BerespStatus-后端响应状态

HTTP响应状态代码。

BerespUnset-后端响应未设置标头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

BogoHeader-收到虚假的HTTP

包含我们无法理解的收到的HTTP头的前20个字符。同时适用于req.http和beresp.http。

CLI-CLI通信

Varnishd主进程和子进程之间的CLI通信。

调试-调试消息

调试消息通常可以忽略,但有时在故障排除期间很有帮助。大多数调试消息必须使用参数显式启用。

可以在不事先通知的情况下添加、更改或删除调试消息,不应将其视为稳定。

注意:默认情况下,此日志记录被屏蔽。

Esi_xmlerror-ESI解析器错误或警告消息

在分析ESI对象期间生成错误或警告。日志记录描述了遇到的问题。

End-标记VXID的结束

VXID事务的最后一条记录。

Error-错误消息

错误消息可能是您想知道的内容。

Expban-因禁令而被驱逐的对象

当对象被禁止时记录VXID。

ExpKill-对象过期事件

记录与对象过期相关的事件。这些活动包括:

EXP_Rearm

在对象的到期时间更改时记录。

EXP_Inbox

在到期线程从收件箱中选择要处理的对象时记录。

EXP_Kill

在过期线程终止收件箱中的对象时记录。

EXP_When

在到期线程移动二进制堆上的对象时记录。

EXP_Expired

在过期线程使对象过期时记录。

LRU_Cand

在评估对象是否存在LRU强制到期时记录。

LRU

当对象因LRU而强制过期时记录。

LRU_Fail

当找不到适合LRU强制到期的候选对象时记录。

格式为::

EXP_Rearm p=%p E=%f e=%f f=0x%x
EXP_Inbox p=%p e=%f f=0x%x
EXP_Kill p=%p e=%f f=0x%x
EXP_When p=%p e=%f f=0x%x
EXP_Expired x=%u t=%f
LRU_Cand p=%p f=0x%x r=%d
LRU x=%u
LRU_Fail

Legend:
p=%p         Objcore pointer
t=%f         Remaining TTL (s)
e=%f         Expiry time (unix epoch)
E=%f         Old expiry time (unix epoch)
f=0x%x       Objcore flags
r=%d         Objcore refcount
x=%u         Object VXID
FetchError-获取对象时出错

记录提取操作失败的错误消息。

错误消息应该是不言而喻的,但报告的http连接(HTC)类错误带有以下符号:

  • 垃圾(-5):收到意外数据

  • Close(-4):连接已关闭

  • 超时(-3):超时

  • 溢出(-2):缓冲区/工作区太小

  • EOF(-1):输入意外结束

  • 空(0):空响应

  • 更多(1):需要更多数据

  • 完成(2):数据完成(无错误)

  • 空闲(3):连接在空闲时关闭

请注意,HTC的一些错误永远不会发出。

FETCH_BODY-从后端获取的正文

准备从后端获取正文。

格式为::

%d %s %s
|  |  |
|  |  +---- 'stream' or '-'
|  +------- Text description of body fetch mode
+---------- Body fetch mode
滤清器-主体滤清器

应用于正文的筛选器列表

对对象执行GZIP-G(Un)Zip

对于执行的每个gZip或GunZip工作实例,都会发出一条GZIP记录。最糟糕的情况是,一个ESI事务存储在gzip格式的对象中,但以Gunziped格式交付,将会遇到很多这样的情况。

格式为::

%c %c %c %d %d %d %d %d
|  |  |  |  |  |  |  |
|  |  |  |  |  |  |  +- Bit length of compressed data
|  |  |  |  |  |  +---- Bit location of 'last' bit
|  |  |  |  |  +------- Bit location of first deflate block
|  |  |  |  +---------- Bytes output
|  |  |  +------------- Bytes input
|  |  +---------------- 'E': ESI, '-': Plain object
|  +------------------- 'F': Fetch, 'D': Deliver
+---------------------- 'G': Gzip, 'U': Gunzip, 'u': Gunzip-test

示例:

U F E 182 159 80 80 1392
G F E 159 173 80 1304 1314
H.RxBody-收到HTTP2框架正文

二进制数据

H.RxHdr-接收的HTTP2帧标头

二进制数据

H.TxBody传输的HTTP2帧主体

二进制数据

H2 TxHdr-传输的HTTP2帧报头

二进制数据

Hash-添加到哈希的值

该值被添加到对象查找哈希中。

注意:默认情况下,此日志记录被屏蔽。

缓存中的命中对象

已在缓存中查找对象。

格式为::

%u %f %f %f [%u [%u]]
|  |  |  |   |   |
|  |  |  |   |   +- Content length
|  |  |  |   +----- Fetched so far
|  |  |  +--------- Keep period
|  |  +------------ Grace period
|  +--------------- Remaining TTL
+------------------ VXID of the object
HitMisse-命中缓存中未命中的对象。

在缓存中查找了命中未命中对象。

格式为::

%u %f
|  |
|  +- Remaining TTL
+---- VXID of the object
HitPass-命中缓存中的Pass对象。

在缓存中查找了命中传球对象。

格式为::

%u %f
|  |
|  +- Remaining TTL
+---- VXID of the object
HttpGartch-无法解析的HTTP请求

记录无法解析的HTTP请求的内容。

Long-对象主体的大小

记录Fetch对象主体的大小。

链接-指向子VXID的链接

将此VXID链接到它启动的任何子VXID。

格式为::

%s %d %s [%u]
|  |  |   |
|  |  |   +- Child task sub-level
|  |  +----- Reason
|  +-------- Child vxid
+----------- Child type ("sess", "req" or "bereq")
LostHeader-尝试设置HTTP标头失败

记录由于资源耗尽或配置的限制而失败的HTTP标头操作的标头名称。

通知-有关请求处理的信息性消息

有关请求处理期间发生的事件的信息性日志消息。

格式为::

%s: %s
|   |
|   +- Short description of the notice message
+----- Manual page containing the detailed description

有关通知消息的详细信息,请参阅下面的通知消息部分或单独的VMOD手册页面。

ObjHeader-对象标头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

对象协议-对象协议

HTTP协议版本信息。

对象原因-对象原因

HTTP响应原因字符串。

ObjStatus-对象状态

HTTP响应状态代码。

ObjUnset-对象未设置标头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

PipeAcct-管道字节数

包含管道会话的字节计数器。

格式为::

%d %d %d %d
|  |  |  |
|  |  |  +------- Piped bytes to client
|  |  +---------- Piped bytes from client
|  +------------- Backend request headers
+---------------- Client request headers
Proxy-代理协议信息

代理协议信息。

格式为::

%d %s %d %s %d
|  |  |  |  |
|  |  |  |  +- server port
|  |  |  +---- server ip
|  |  +------- client port
|  +---------- client ip
+------------- PROXY protocol version

All fields are "local" for PROXY local connections (command 0x0)
ProxyGartch-无法解析的代理请求

代理协议头无法分析。

ReqAcct-请求处理字节数

包含请求处理的字节计数。正文字节数包括传输开销(即:分块编码)。ESI子请求显示该ESI片段的主体字节,该ESI片段包括构成顶级请求的任何子片段。格式为::

%d %d %d %d %d %d
|  |  |  |  |  |
|  |  |  |  |  +- Total bytes transmitted
|  |  |  |  +---- Body bytes transmitted
|  |  |  +------- Header bytes transmitted
|  |  +---------- Total bytes received
|  +------------- Body bytes received
+---------------- Header bytes received
ReqHeader-客户端请求标头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

ReqMethod-客户端请求方法

使用的HTTP请求方法。

请求协议-客户端请求协议

HTTP协议版本信息。

ReqStart-客户端请求启动

请求处理开始。记录客户端地址、端口号和监听程序端点名称(来自-a命令行参数)。

格式为::

%s %s %s
|  |  |
|  |  +-- Listener name (from -a)
|  +----- Client Port number (0 for Unix domain sockets)
+-------- Client IP4/6 address (0.0.0.0 for UDS)
ReqURL-客户端请求URL

HTTP请求URL。

ReqUnset-客户端请求取消设置标头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

RespHeader-客户端响应头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

RespProtocol-客户端响应协议

HTTP协议版本信息。

RespReason-客户端响应原因

HTTP响应原因字符串。

RespStatus-客户端响应状态

HTTP响应状态代码。

RespUnset-客户端响应未设置标头

HTTP标头内容。

格式为::

%s: %s
|   |
|   +- Header value
+----- Header name

注意:HTTP标头字段是自由格式记录,严格来说不是由2个字段组成。使用前缀表示法访问特定标头有助于将标头值视为单个字符串。

SessClose-客户端连接已关闭

SessClose是所有客户端连接的最后记录。

格式为::

%s %f
|  |
|  +- How long the session was open
+---- Why the connection closed
SessError-客户端连接接受失败

接受客户端连接失败。

格式为::

%s %s %s %d %d %s
|  |  |  |  |  |
|  |  |  |  |  +- Detailed error message
|  |  |  |  +---- Error Number (errno) from accept(2)
|  |  |  +------- File descriptor number
|  |  +---------- Local TCP port / 0 for UDS
|  +------------- Local IPv4/6 address / 0.0.0.0 for UDS
+---------------- Socket name (from -a argument)
SessOpen-客户端连接已打开

客户端连接的第一条记录,以及该连接的套接字端点。

格式为::

%s %d %s %s %s %f %d
|  |  |  |  |  |  |
|  |  |  |  |  |  +- File descriptor number
|  |  |  |  |  +---- Session start time (unix epoch)
|  |  |  |  +------- Local TCP port / 0 for UDS
|  |  |  +---------- Local IPv4/6 address / 0.0.0.0 for UDS
|  |  +------------- Socket name (from -a argument)
|  +---------------- Remote TCP port / 0 for UDS
+------------------- Remote IPv4/6 address / 0.0.0.0 for UDS
存储-存储对象的位置

存储对象的存储后端的类型和名称。

格式为::

%s %s
|  |
|  +- Name of storage backend
+---- Type ("malloc", "file", "persistent" etc.)
TTL-对象上设置的TTL

每当设置了对象的TTL、GREASE或Keep值以及该对象是否可缓存时,都会发出TTL记录。

格式为::

%s %d %d %d %d [ %d %d %u %u ] %s
|  |  |  |  |    |  |  |  |    |
|  |  |  |  |    |  |  |  |    +- "cacheable" or "uncacheable"
|  |  |  |  |    |  |  |  +------ Max-Age from Cache-Control header
|  |  |  |  |    |  |  +--------- Expires header
|  |  |  |  |    |  +------------ Date header
|  |  |  |  |    +--------------- Age (incl Age: header value)
|  |  |  |  +-------------------- Reference time for TTL
|  |  |  +----------------------- Keep
|  |  +-------------------------- Grace
|  +----------------------------- TTL
+-------------------------------- "RFC", "VCL" or "HFP"

这四个可选字段仅出现在“RFC”报头中。

示例:

RFC 60 10 -1 1312966109 1312966109 1312966109 0 60 cacheable
VCL 120 10 0 1312966111 uncacheable
HFP 2 0 0 1312966113 uncacheable
时间戳-计时信息

包含Varnish工作线程的计时信息。

时间戳由Varnish在某些事件上发布,并显示事件的绝对时间、自工作单元开始以来花费的时间以及自上次记录时间戳以来花费的时间。有关各个时间戳的信息,请参阅下面的时间戳部分。

格式为::

%s: %f %f %f
|   |  |  |
|   |  |  +- Time since last timestamp
|   |  +---- Time since start of work unit
|   +------- Absolute time of event
+----------- Event label
VCL_ERROR-VCL执行错误消息

记录在VCL执行期间生成的错误消息。

VCL_Log-来自VCL的日志语句

用户生成的日志消息通过std.log()从VCL插入

VCL_ACL-VCL ACL检查结果

带有的ACL +log FLAG发出该记录和结果。

格式为::

%s [%s [%s [fixed: %s]]]
|   |   |          |
|   |   |          +- Fix info (see below)
|   |   +------------ Matching entry (only for MATCH)
|   +---------------- Name of the ACL for MATCH or NO_MATCH
+-------------------- MATCH, NO_MATCH or NO_FAM
  • 修复信息:包含非规范条目的网络/掩码(请参阅ACL+Pedtic标志)或 folded 对于作为折叠操作结果的条目(请参见ACL+折叠标志)。

  • MATCH 表示ACL匹配

  • NO_MATCH 表示选中的ACL不匹配

  • NO_FAM 表示缺少地址系列,不应发生。

VCL_CALL-调用的VCL方法

调用VCL方法时记录VCL方法名称。

VCL_RETURN-VCL方法返回值

记录VCL方法终止语句。

VCL_TRACE-VCL跟踪数据

记录VCL执行跟踪数据。

格式为::

%s %u %u.%u.%u
|  |  |  |  |
|  |  |  |  +- VCL program line position
|  |  |  +---- VCL program line number
|  |  +------- VCL program source index
|  +---------- VCL trace point index
+------------- VCL configname

注意:默认情况下,此日志记录被屏蔽。

VCL_USE-VCL在使用中

记录正在使用的VCL的名称。

格式为::

%s [ %s %s ]
|    |  |
|    |  +- Name of label used to find it
|    +---- "via"
+--------- Name of VCL put in use
VSL-VSL API警告和错误消息

VSL API在读取共享内存日志时生成的警告和错误消息。

VdpAcct-交付过滤器记帐

包含VDP的名称和统计信息。

格式为::

%s %d %d
|  |  |
|  |  +- Total bytes produced
|  +---- Number of calls made
+------- Name of filter

注意:默认情况下,此日志记录被屏蔽。

VfpAcct-获取过滤器记帐

包含VFP名称和统计信息。

格式为::

%s %d %d
|  |  |
|  |  +- Total bytes produced
|  +---- Number of calls made
+------- Name of filter

注意:默认情况下,此日志记录被屏蔽。

证人-锁定令证人记录

锁定顺序的诊断记录。

WorkThread-记录线程启动/停止事件

记录工作线程创建和终止事件。

格式为::

%p %s
|  |
|  +- [start|end]
+---- Worker struct pointer

注意:默认情况下,此日志记录被屏蔽。

TIMESTAMPS

在工作线程的任务处理期间完成某些事件时,时间戳被插入到日志中。时间戳有一个标签,显示哪个事件已完成。报告的字段显示事件的绝对时间、自任务开始以来花费的时间以及自上次记录时间戳以来花费的时间。

Varnish自动记录的时间戳是在完成预期会有延迟的事件(例如网络IO或等待列表上的时间)后插入的。也可以使用std.Timestamp()函数从VCL插入时间戳。如果在VCL配置中执行耗时的任务,最好在完成该任务后记录时间戳。这防止了后续时间戳中的计时信息包括花费在VCL事件上的时间。

请求处理时间戳

开始

请求处理的开始(接收的第一个字节或重新启动)。

req

已收到完整的客户端请求。

ReqBody

客户端请求正文已处理(丢弃、缓存或传递到后端)。

等待名单

从等待名单上掉下来了。

获取

获取处理已完成(已完全获取或已准备好进行流处理)。

过程

处理已完成,准备传递客户端响应。

响应

向客户端传递响应已完成。

重新启动

正在重新启动客户端请求。

重置

客户端关闭其连接、重置其流或导致流错误,从而迫使Varish重置流。请求处理中断并被视为失败,状态代码为408“请求超时”。

管道处理时间戳

以下时间戳是特定于管道事务的客户端时间戳:

管道

打开到后端的管道并转发请求。

PipeSess

管道会话已完成。

以下时间戳更改了管道事务中的含义:

过程

处理完成,准备开始管道输送。

后端获取时间戳

开始

后端获取处理的开始。

获取

VCL_BACKEND_FETCH已准备好发送后端请求。

连着

已成功建立后端连接,或从池中选择了回收的连接。

贝雷克

已发送后端请求。

贝雷斯普

已收到后端响应头。

过程

处理已完成,准备获取响应正文。

BerespBody

已收到后端响应正文。

重试

正在重试后端请求。

误差率

后端请求VCL_BACKEND_ERROR失败。

通知消息

通知消息包含有关请求处理的信息性消息。这些可能是遇到的异常情况,会导致与正常操作的偏差。这些消息以前缀 vsl: 对于核心Varnish生成的消息,鼓励VMOD作者使用 vmod_<name>: 用于他们自己的通知消息。这与手册页的名称相匹配,手册页需要详细的通知消息描述。

核心信息如下所述。

流对象的条件获取等待

后端应答304在使用尚未被完全获取的对象作为过时模板对象的条件获取时未被修改。只有当对象的TTL小于获取它所需的时间时,才会发生这种情况。获取暂停,直到完全获取过时的对象,然后照常创建新对象。在等待期间,过期对象上的任何宽限时间都将生效。

大量的变种

对象主要是使用从 hash_data() VCL函数。当涉及变量时,也就是说,当后端响应存储在 Vary 标头,则执行二次查找,但不对其编制索引。随着给定键的变量数量的增加,这可能会减慢缓存查找的速度,而且由于这发生在锁中,这可能会极大地增加锁争用,对于频繁请求的对象来说更是如此。因此,在可缓存的响应上应谨慎使用变体,但由于它们可以来自VCL或源服务器,因此此通知应有助于识别有问题的资源。

HISTORY

本文最初由Pul-Henning Kamp撰写,后来由Martin Blix Grydeland更新。

另请参阅