Я использую Varnish 3.0.3 на RHEL 6 в качестве кэширующего балансировщика нагрузки перед несколькими веб-серверами Apache и хочу вести журнал, когда Varnish видит, что серверные компоненты меняются с исправного на неполноценный и обратно.
Из командной строки я могу запустить varnishlog -O -I "Back healthy|Went sick"
и увидите следующие строки:
0 Backend_health - webserver1 Went sick 4--X--- 2 3 5 0.000000 0.000679
0 Backend_health - webserver1 Back healthy 4--X-RH 3 3 5 0.000622 0.000679 HTTP/1.1 200 OK
Я бы с удовольствием записал эти изменения нездорового / исправного состояния в файл журнала, но они бесполезны, если с ними не связаны временные метки. Как я могу записать эти строки в файл журнала и включить временные метки для каждой строки?
Выход varnishlog
можно передать по конвейеру на awk и переформатировать, чтобы поставить дату в начале каждой строки. Сложность в том, что varnishlog
буферизует вывод, что приводит к его отправке только в awk
после того, как было сгенерировано несколько строк, в результате чего все строки получат ту же временную метку, что и последняя, завершившая буфер. Чтобы обойти это, unbuffer
команда может использоваться для конвейерной передачи вывода varnishlog
к awk
сразу, чтобы каждая строка получила соответствующую отметку времени.
unbuffer varnishlog -O -I 'Back healthy|Went sick' 2>&1 | awk '{ print strftime(), $0; fflush() }'
Это приводит к выводу, подобному приведенному ниже, который затем можно добавить в файл журнала.
Wed Feb 20 15:20:58 EST 2013 0 Backend_health - webserver1 Went sick 4--X--- 2 3 5 0.000000 0.000679
Wed Feb 20 15:28:03 EST 2013 0 Backend_health - webserver1 Back healthy 4--X-RH 3 3 5 0.000622 0.000679 HTTP/1.1 200 OK
Примечание: благодаря этот ответ Кирон и этот ответ по Марк Харрисон для частей, необходимых, чтобы понять это.