Создание для производства: веб-приложения - централизованное ведение журнала

Вступление

Мы наконец-то готовы настроить централизованное ведение журналов для настройки нашего производственного приложения. Централизованное ведение журнала является отличным способом для сбора и визуализации журналов ваших серверов. Как правило, настройка сложной системы ведения журналов не так важна, как создание надежных резервных копий и мониторинг, но она может быть очень полезна при попытке выявить тенденции или проблемы с вашим приложением.

изображение: https: //assets.digitalocean.com/articles/architecture/production/centralized_logging.png [Централизованная схема ведения журнала]

В этом руководстве мы настроим стек ELK (Elasticsearch, Logstash и Kibana) и настроим серверы, входящие в наше приложение, для отправки соответствующих журналов на сервер журналов. Мы также создадим L[stash filters, которые будут анализировать и структурировать наши журналы, что позволит нам легко искать и фильтровать их, и использовать их в визуализациях Кибана.

Предпосылки

Если вы хотите получить доступ к своей панели регистрации через доменное имя, создайте * A Record * в своем домене, например, «logging.example.com», который указывает на публичный IP-адрес вашего * logging * сервера. Кроме того, вы можете получить доступ к панели мониторинга мониторинга через общедоступный IP-адрес. Рекомендуется настроить веб-сервер регистрации для использования HTTPS и ограничить доступ к нему, разместив его за VPN.

Установите ELK на сервере регистрации

Настройте ELK на своем сервере * logging *, следуя этому руководству: https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14- 04 [Как установить Elasticsearch, Logstash и Kibana 4 в Ubuntu 14.04].

Если вы используете частный DNS для разрешения имен, обязательно следуйте * Варианту 2 * в https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4 -on-ubuntu-14-04 # generate-ssl-сертификаты [раздел Создать сертификаты SSL].

Остановитесь, когда дойдете до раздела * Set Logstash Forwarder *.

Настройте Logstash Forwarder на клиентах

Настройте Logstash Forwarder, отправитель журналов, на своих клиентских серверах, т.е. db1, app1, app2 и lb1, следуя https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-logstash-and-kibana-4-on-ubuntu-14-04# set-up-logstash-forwarder- (add-client-server) [раздел «Настройка Logstash Forwarder]» руководства ELK.

Когда вы закончите, вы сможете войти в Kibana через общедоступный сетевой адрес сервера * logging * и просмотреть системные журналы каждого из ваших серверов.

Определите журналы для сбора

В зависимости от вашего конкретного приложения и настроек, различные журналы будут доступны для сбора в стек ELK. В нашем случае мы будем собирать следующие журналы:

  • Журналы медленных запросов MySQL (db1)

  • Доступ к Apache и журналы ошибок (app1 и app2)

  • Журналы HAProxy (lb1)

Мы выбрали эти журналы, потому что они могут предоставить некоторую полезную информацию при устранении неполадок или попытке выявления тенденций. На ваших серверах могут быть другие журналы, которые вы хотите собрать, но это поможет вам начать работу.

Настроить журналы MySQL

Журнал медленных запросов MySQL обычно находится в + / var / log / mysql / mysql-slow. Он состоит из журналов, которые выполняются достаточно долго, чтобы считаться «медленными запросами», поэтому идентификация этих запросов может помочь вам оптимизировать или устранить неполадки в вашем приложении.

Включить MySQL Slow Query Log

Медленный журнал запросов не включен по умолчанию, поэтому давайте настроим MySQL для регистрации этих типов запросов.

Откройте файл конфигурации MySQL:

sudo vi /etc/mysql/my.cnf

Найдите закомментированную строку «logslowqueries» и раскомментируйте ее так, чтобы она выглядела следующим образом:

/etc/mysql/my.cnf

log_slow_queries        = /var/log/mysql/mysql-slow.log

Сохранить и выйти.

Нам нужно перезапустить MySQL, чтобы изменения вступили в силу:

sudo service mysql restart

Теперь MySQL будет регистрировать свои длительные запросы в файле журнала, указанном в конфигурации.

Отправлять файлы журнала MySQL

Мы должны настроить Logstash Forwarder для отправки журнала медленных запросов MySQL на наш сервер регистрации.

На сервере базы данных db1 откройте файл конфигурации Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Добавьте следующее в раздел «файлы» под существующими записями, чтобы отправить медленные журналы запросов MySQL типа «mysql-slow» на ваш сервер Logstash:

logstash-forwarder.conf - медленный запрос MySQL

,
   {
     "paths": [
       "/var/log/mysql/mysql-slow.log"
      ],
     "fields": { "type": "mysql-slow" }
   }

Сохранить и выйти. Это позволяет Logstash Forwarder отправлять журналы медленных запросов MySQL и помечать их как журналы типа «mysql-slow», которые позже будут использоваться для фильтрации.

Перезапустите Logstash Forwarder, чтобы начать отправку журналов:

sudo service logstash-forwarder restart

Многострочный входной кодек

Журнал медленных запросов MySQL находится в многострочном формате (т.е. каждая запись занимает несколько строк), поэтому мы должны включить многострочный кодек Logstash, чтобы иметь возможность обрабатывать этот тип журнала.

На сервере ELK, * logging *, откройте файл конфигурации, в котором определен ваш вход в Lumberjack:

sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

В определении ввода + lumberjack + добавьте следующие строки:

   codec => multiline {
     pattern => "^# User@Host:"
     negate => true
     what => previous
   }

Сохранить и выйти. Это настраивает Logstash для использования многострочного процессора журналов, когда он встречает журналы, которые содержат указанный шаблон (т.е. начинается с «# User @ Host:»).

Далее мы настроим фильтр Logstash для журналов MySQL.

MySQL Log Filter

На сервере ELK * logging * откройте новый файл, чтобы добавить наши фильтры журнала MySQL в Logstash. Мы назовем его + 11-mysql.conf +, поэтому он будет прочитан после конфигурации входа Logstash (в файле + 01-lumberjack-input.conf +):

sudo vi /etc/logstash/conf.d/11-mysql.conf

Добавьте следующее определение фильтра:

11-mysql.conf

filter {
 # Capture user, optional host and optional ip fields
 # sample log file lines:
 if [type] == "mysql-slow" {
   grok {
     match => [ "message", "^# User@Host: %{USER:user}(?:\[[^\]]+\])?\s+@\s+%{HOST:host}?\s+\[%{IP:ip}?\]" ]
   }
   # Capture query time, lock time, rows returned and rows examined
   grok {
     match => [ "message", "^# Query_time: %{NUMBER:duration:float}\s+Lock_time: %{NUMBER:lock_wait:float} Rows_sent: %{NUMBER:results:int} \s*Rows_examined: %{NUMBER:scanned:int}"]
   }
   # Capture the time the query happened
   grok {
     match => [ "message", "^SET timestamp=%{NUMBER:timestamp};" ]
   }
   # Extract the time based on the time of the query and not the time the item got logged
   date {
     match => [ "timestamp", "UNIX" ]
   }
   # Drop the captured timestamp field since it has been moved to the time of the event
   mutate {
     remove_field => "timestamp"
   }
 }
}

Сохранить и выйти. Это настраивает Logstash для фильтрации журналов типа + mysql-slow + с помощью шаблонов Grok, указанных в директивах + match +. Журналы типа + apache-access + анализируются с помощью предоставленного Logstash шаблона Grok, который соответствует стандартному формату сообщений журнала Apache, в то время как журналы типа + apache-error + анализируются фильтром Grok, который был записан для соответствия формат журнала ошибок по умолчанию.

Чтобы эти фильтры работали, давайте перезапустим Logstash:

sudo service logstash restart

На этом этапе вы захотите убедиться, что Logstash работает правильно, так как ошибки конфигурации приведут к сбою.

изображение: https: //assets.digitalocean.com/articles/architecture/production/lamp/kibana.png [Панель управления Kibana]

Вы также захотите подтвердить, что Kibana может просматривать отфильтрованные журналы Apache.

Apache Logs

Журналы Apache обычно находятся в + / var / log / apache2 + и называются «access.log» и «error.log». Сбор этих журналов позволит вам просматривать IP-адреса тех, кто обращается к вашим серверам, что они запрашивают, а также какие ОС и веб-браузеры они используют, в дополнение к любым сообщениям об ошибках, о которых сообщает Apache.

Файлы журналов Apache

Мы должны настроить Logstash Forwarder для отправки журналов доступа и ошибок Apache на наш сервер регистрации.

На серверах приложений app1 и app2 откройте файл конфигурации Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Добавьте следующее в раздел «файлы» под существующими записями, чтобы отправлять журналы Apache в виде соответствующих типов на ваш сервер Logstash:

logstash-forwarder.conf - доступ к Apache и журналы ошибок

,
   {
     "paths": [
       "/var/log/apache2/access.log"
      ],
     "fields": { "type": "apache-access" }
   },
   {
     "paths": [
       "/var/log/apache2/error.log"
      ],
     "fields": { "type": "apache-error" }
   }

Сохранить и выйти. Это позволяет Logstash Forwarder отправлять журналы доступа и ошибок Apache и помечать их как соответствующие им типы, которые будут использоваться для фильтрации журналов.

Перезапустите Logstash Forwarder, чтобы начать отправку журналов:

sudo service logstash-forwarder restart

Прямо сейчас все ваши журналы Apache будут иметь исходный IP-адрес клиента, который соответствует частному IP-адресу сервера HAProxy, поскольку обратный прокси-сервер HAProxy является единственным способом доступа к вашим серверам приложений из Интернета. Чтобы изменить это, чтобы показать исходный IP-адрес реального пользователя, который обращается к вашему сайту, мы можем изменить формат журнала Apache по умолчанию, чтобы использовать заголовки + X-Forwarded-For +, которые отправляет HAProxy.

Откройте файл конфигурации Apache (apache2.conf):

sudo vi /etc/apache2/apache2.conf

Найдите строку, которая выглядит так:

[Label apache2.conf - Original "combined" LogFormat]
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Замените *% h * на *% \ {X-Forwarded-For} i *, чтобы оно выглядело так:

[Label apache2.conf - Updated "combined" LogFormat]
LogFormat " %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Сохранить и выйти. Это настраивает журнал доступа Apache для включения исходного IP-адреса ваших реальных пользователей вместо частного IP-адреса сервера HAProxy.

Перезапустите Apache, чтобы изменения вступили в силу:

sudo service apache2 restart

Теперь мы готовы добавить фильтры журналов Apache в Logstash.

Apache Log Filters

На сервере ELK, * logging *, откройте новый файл, чтобы добавить наши фильтры журналов Apache в Logstash. Мы назовем его + 12-apache.conf +, поэтому он будет прочитан после конфигурации ввода Logstash (в файле + 01-lumberjack-input.conf +):

sudo vi /etc/logstash/conf.d/12-apache.conf

Добавьте следующие определения фильтров:

12-apache.conf

filter {
 if [type] == "apache-access" {
   grok {
     match => { "message" => "%{COMBINEDAPACHELOG}" }
   }
 }
}
filter {
 if [type] == "apache-error" {
   grok {
     match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{DATA:severity}\] \[pid %{NUMBER:pid}\] \[client %{IPORHOST:clientip}:%{POSINT:clientport}] %{GREEDYDATA:error_message}" }
   }
 }
}

Сохранить и выйти. Это настраивает Logstash для фильтрации журналов типов + apache-access + и + apache-error с шаблонами Grok, указанными в соответствующих директивах` + match + . Журналы типа `+ apache-access + анализируются с помощью предоставленного Logstash шаблона Grok, который соответствует стандартному формату сообщений журнала Apache, в то время как журналы типа + apache-error + анализируются фильтром Grok, который был записан для соответствия формат журнала ошибок по умолчанию.

Чтобы эти фильтры работали, давайте перезапустим Logstash:

sudo service logstash restart

На этом этапе вы захотите убедиться, что Logstash работает правильно, так как ошибки конфигурации приведут к сбою. Вы также захотите подтвердить, что Kibana может просматривать отфильтрованные журналы Apache.

HAProxy Logs

Журналы HAProxy обычно находятся в + / var / log / haproxy.log +. Сбор этих журналов позволит вам посмотреть IP-адреса тех, кто обращается к вашему балансировщику нагрузки, что они запрашивают, какой сервер приложений обслуживает их запросы, а также различные другие сведения о соединении.

Отправка файлов журнала HAProxy

Мы должны настроить Logstash Forwarder для отправки журналов HAProxy.

На вашем сервере HAProxy * lb1 * откройте файл конфигурации Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf

Добавьте следующее в раздел «файлы» под существующими записями, чтобы отправить журналы HAProxy типа «haproxy-log» на ваш сервер Logstash:

logstash-forwarder.conf - журналы HAProxy

,
   {
     "paths": [
       "/var/log/haproxy.log"
      ],
     "fields": { "type": "haproxy-log" }
   }

Сохранить и выйти. Это позволяет Logstash Forwarder отправлять журналы HAProxy и помечать их как + haproxy-log +, что будет использоваться для фильтрации журналов.

Перезапустите Logstash Forwarder, чтобы начать отправку журналов:

sudo service logstash-forwarder restart

Фильтр журнала HAProxy

На сервере ELK * logging * откройте новый файл, чтобы добавить наш фильтр журнала HAProxy в Logstash. Мы назовем его + 13-haproxy.conf +, поэтому он будет прочитан после конфигурации входа Logstash (в файле + 01-lumberjack-input.conf +):

sudo vi /etc/logstash/conf.d/13-haproxy.conf

Добавьте следующее определение фильтра:

filter {
 if [type] == "haproxy-log" {
   grok {
     match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{SYSLOGPROG}: %{IPORHOST:clientip}:%{POSINT:clientport} \[%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}:%{TIME}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} "(%{WORD:http_verb} %{URIPATHPARAM:http_request} HTTP/%{NUMBER:http_version})|<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://))" }
   }
 }
}

Сохранить и выйти. Это настраивает Logstash на фильтрацию журналов типов + haproxy-log + с шаблонами Grok, указанными в соответствующей директиве + match +. Журналы типа + haproxy-log + анализируются с помощью предоставленного Logstash шаблона Grok, который соответствует стандартному формату сообщения журнала HAProxy.

Чтобы эти фильтры работали, давайте перезапустим Logstash:

sudo service logstash restart

На этом этапе вы захотите убедиться, что Logstash работает правильно, так как ошибки конфигурации приведут к сбою.

Настройка визуализаций Kibana

Теперь, когда вы собираете свои журналы в одном месте, вы можете начать использовать Kibana для их визуализации. Это руководство поможет вам начать с этого: Как использовать панели управления и визуализации Kibana.

Когда вы освоитесь с Kibana, попробуйте этот учебник, чтобы интересно представить своих пользователей: https://www.digitalocean.com/community/tutorials/how-to-map-user-location-with-geoip-and -elk -asticsearch-logstash-and-kibana Как сопоставить местоположение пользователя с помощью GeoIP и ELK.

Заключение

Поздравляем! Вы завершили серию учебного пособия по настройке производственного веб-приложения. Если вы следовали всем учебным пособиям, у вас должна быть настройка, похожая на ту, которую мы описали в обзорном учебном пособии (с частным DNS и удаленным резервным копированием):

изображение: https: //assets.digitalocean.com/articles/architecture/production/lamp/final.png [Настройка производства]

То есть у вас должно быть работающее приложение с отделенными компонентами, которое поддерживается компонентами резервного копирования, мониторинга и централизованного ведения журнала. Обязательно протестируйте свое приложение и убедитесь, что все компоненты работают должным образом.

Related