Linux

如何根據 XID 過濾 Varnish 日誌?

  • November 15, 2011

我遇到了罕見的 503 錯誤,這些錯誤似乎很難查明。Varnishlog 快把我逼瘋了,因為我似乎無法從中獲得我想要的資訊。

我希望看到 Varnish 所看到的客戶端和後端通信。我認為記錄在 Varnish 的預設錯誤頁面上的 XID 號可以讓我從日誌緩衝區中過濾出確切的請求。但是,沒有任何 varnishlog 參數的組合可以提供我需要的輸出。

以下僅顯示客戶端通信:

varnishlog -d -c -m ReqStart:1427305652

而這僅顯示生成的後端通信:

varnishlog -d -b -m TxHeader:1427305652

是否有一條線來顯示整個請求?

因為在與客戶端通信時,XID 也會出現在TxHeader標記行中:

  12 SessionOpen  c 127.0.0.1 33829 :80
  12 ReqStart     c 127.0.0.1 33829 1171098618
  12 RxRequest    c GET
  12 RxURL        c /
  12 RxProtocol   c HTTP/1.1
  12 RxHeader     c Host: ganglia.gentoo
  12 RxHeader     c User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
  12 RxHeader     c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  12 RxHeader     c Accept-Language: en-us
  12 RxHeader     c Accept-Encoding: gzip, deflate
  12 RxHeader     c Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  12 RxHeader     c Connection: keep-alive
  12 VCL_call     c recv lookup
  12 VCL_call     c hash
  12 Hash         c /
  12 Hash         c ganglia.gentoo
  12 VCL_return   c hash
  12 HitPass      c 1171098616
  12 VCL_call     c pass pass
  12 Backend      c 13 apache apache
  12 TTL          c 1171098618 RFC 120 -1 -1 1317921851 0 1317921851 0 0
  12 VCL_call     c fetch
  12 TTL          c 1171098618 VCL 120 -1 -1 1317921851 -0
  12 VCL_return   c hit_for_pass
  12 ObjProtocol  c HTTP/1.1
  12 ObjResponse  c OK
  12 ObjHeader    c Date: Thu, 06 Oct 2011 17:24:11 GMT
  12 ObjHeader    c Server: Apache
  12 ObjHeader    c Content-Length: 17
  12 ObjHeader    c Content-Type: text/html
  12 VCL_call     c deliver deliver
  12 TxProtocol   c HTTP/1.1
  12 TxStatus     c 200
  12 TxResponse   c OK
  12 TxHeader     c Server: Apache
  12 TxHeader     c Content-Type: text/html
  12 TxHeader     c Content-Length: 17
  12 TxHeader     c Accept-Ranges: bytes
  12 TxHeader     c Date: Thu, 06 Oct 2011 17:24:11 GMT
  12 TxHeader     c X-Varnish: 1171098618
  12 TxHeader     c Age: 0
  12 TxHeader     c Via: 1.1 varnish
  12 TxHeader     c Connection: keep-alive
  12 Length       c 17
  12 ReqEnd       c 1171098618 1317921851.307137489 1317921851.344322681 0.000065327 0.037110329 0.000074852

正如@Oneiroi 提到的,根據man page

  -b     Include log entries which result from communication with a backend server.  If neither -b  nor  -c
         is specified, varnishlog acts as if they both were.

  -c     Include log entries which result from communication with a client.  If neither -b nor -c is speci‐
         fied, varnishlog acts as if they both were.

所以,試試這個:

varnishlog -d -m TxHeader:XID | awk '$1 !~ /0/ { print $0 }'

樣本結果:

varnishlog -d -m TxHeader:1171098618 | awk '$1 !~ /0/ { print $0 }'
  13 BackendOpen  b apache 127.0.0.1 40207 127.0.0.1 8080
  13 TxRequest    b GET
  13 TxURL        b /
  13 TxProtocol   b HTTP/1.1
  13 TxHeader     b Host: ganglia.gentoo
  13 TxHeader     b User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
  13 TxHeader     b Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  13 TxHeader     b Accept-Language: en-us
  13 TxHeader     b Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  13 TxHeader     b X-Forwarded-For: 127.0.0.1
  13 TxHeader     b Accept-Encoding: gzip
  13 TxHeader     b X-Varnish: 1171098618
  13 RxProtocol   b HTTP/1.1
  13 RxStatus     b 200
  13 RxResponse   b OK
  13 RxHeader     b Date: Thu, 06 Oct 2011 17:24:11 GMT
  13 RxHeader     b Server: Apache
  13 RxHeader     b Content-Length: 17
  13 RxHeader     b Content-Type: text/html
  13 Fetch_Body   b 4 0 1
  13 Length       b 17
  13 BackendReuse b apache
  12 SessionOpen  c 127.0.0.1 33829 :80
  12 ReqStart     c 127.0.0.1 33829 1171098618
  12 RxRequest    c GET
  12 RxURL        c /
  12 RxProtocol   c HTTP/1.1
  12 RxHeader     c Host: ganglia.gentoo
  12 RxHeader     c User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0
  12 RxHeader     c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  12 RxHeader     c Accept-Language: en-us
  12 RxHeader     c Accept-Encoding: gzip, deflate
  12 RxHeader     c Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  12 RxHeader     c Connection: keep-alive
  12 VCL_call     c recv lookup
  12 VCL_call     c hash
  12 Hash         c /
  12 Hash         c ganglia.gentoo
  12 VCL_return   c hash
  12 HitPass      c 1171098616
  12 VCL_call     c pass pass
  12 Backend      c 13 apache apache
  12 TTL          c 1171098618 RFC 120 -1 -1 1317921851 0 1317921851 0 0
  12 VCL_call     c fetch
  12 TTL          c 1171098618 VCL 120 -1 -1 1317921851 -0
  12 VCL_return   c hit_for_pass
  12 ObjProtocol  c HTTP/1.1
  12 ObjResponse  c OK
  12 ObjHeader    c Date: Thu, 06 Oct 2011 17:24:11 GMT
  12 ObjHeader    c Server: Apache
  12 ObjHeader    c Content-Length: 17
  12 ObjHeader    c Content-Type: text/html
  12 VCL_call     c deliver deliver
  12 TxProtocol   c HTTP/1.1
  12 TxStatus     c 200
  12 TxResponse   c OK
  12 TxHeader     c Server: Apache
  12 TxHeader     c Content-Type: text/html
  12 TxHeader     c Content-Length: 17
  12 TxHeader     c Accept-Ranges: bytes
  12 TxHeader     c Date: Thu, 06 Oct 2011 17:24:11 GMT
  12 TxHeader     c X-Varnish: 1171098618
  12 TxHeader     c Age: 0
  12 TxHeader     c Via: 1.1 varnish
  12 TxHeader     c Connection: keep-alive
  12 Length       c 17
  12 ReqEnd       c 1171098618 1317921851.307137489 1317921851.344322681 0.000065327 0.037110329 0.000074852

引用自:https://serverfault.com/questions/330790