Разработка и производство веб-приложений: централизованное логирование

Теперь можно настроить централизованное логирование серверов производства.

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

Данное руководство поможет установить стек ELK (Elasticsearch, Logstash, Kibana) и настроить компоненты приложения для отправки логов на отдельный сервер логирования. Также вы узнаете, как добавить фильтры Logstash для систематизации и структурирования логов.

Читайте также: Централизованное логирование с помощью фильтров Logstash

Требования

Чтобы получить доступ к дашборду логов по домену, создайте запись А, указывающую на внешний IP-адрес сервера logging. Доступ к дашборду можно получить и по внешнему IP-адресу. Рекомендуется настроить сервер мониторинга для поддержки HTTPS и ограничить доступ к нему с помощью VPN.

Примечание: Сервер логирования в руководстве называется logging.

1: Установка стека ELK

Подробные инструкции по установке стека ELK на сервер logging можно найти в мануале Установка Elasticsearch 1.7, Logstash 1.5 и Kibana 4.1 в Ubuntu 14.04; выполните руководство до раздела «Настройка Logstash Forwarder на клиентских серверах».

Если вы используете частный DNS для разрешения имен, в разделе о генерировании SSL-сертификата выберите вариант 2.

2: Настройка Logstash Forwarder

Чтобы настроить Logstash Forwarder на клиентских серверах (db1, app1, app2, lb1), выполните раздел Настройка Logstash Forwarder этого руководства.

После этого вы сможете войти в Kibana с помощью общедоступного сетевого адреса сервера logging и просмотреть syslogs каждого сервера.

3: Определение логов

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

  • Журнал медленных запросов MySQL (db1).
  • Логи доступа и ошибок Apache (app1 и app2).
  • Логи HAProxy (lb1).

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

Примечание: Возможно, для обслуживания вашего приложения понадобятся и другие логи.

4: Настройка логов MySQL

Журнал медленных запросов MySQL обычно находится в /var/log/mysql/mysql-slow.

Определение этих запросов может помочь оптимизировать работу БД или устранить неполадки в приложении.

Включение журнала медленных запросов

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

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

sudo vi /etc/mysql/my.cnf

Найдите и раскомментируйте строку log_slow_queries:

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

Сохраните и закройте файл.

Перезапустите MySQL:

sudo service mysql restart

Передача логов MySQL

Теперь нужно настроить Logstash Forwarder для передачи логов MySQL на сервер логирования.

Откройте конфигурационный файл Logstash Forwarder на сервере db1.

sudo vi /etc/logstash-forwarder.conf

Добавьте следующие строки в конец раздела files.

,
{
"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, чтобы иметь возможность обрабатывать этот тип логов.

Перейдите на сервер logging (где установлен ELK) и откройте конфигурационный файл Lumberjack:

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

В определении входа lumberjack добавьте строки:

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

Сохраните и закройте файл.

Фильтрация логов MySQL

На сервере logging откройте новый файл и добавьте в него фильтры Logstash для MySQL.

Назовите его 11-mysql.conf, чтобы он читался после файла 01-lumberjack-input.conf.

sudo vi /etc/logstash/conf.d/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 обрабатываются с помощью шаблона Grok, который соответствует формату сообщения лога Apache по умолчанию; логи типа apache-error обрабатываются фильтром Grok, который соответствует формату лога ошибок по умолчанию.

Чтобы фильтры начали работать, перезапустите Logstash:

sudo service logstash restart

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

5: Логи Apache

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

Передача логов Apache

Теперь нужно настроить Logstash Forwarder для передачи логов Apache на сервер логирования.

Откройте конфигурационный файл Logstash Forwarder на серверах app1 и app2.

sudo vi /etc/logstash-forwarder.conf

Добавьте следующие строки в конец раздела files.

,
{
"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.

Откройте файл 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 "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

Сохраните и закройте файл.

Теперь логи доступа Apache будут регистрировать IP-адреса пользователей, а не внутренний IP-адрес HAProxy.

Перезапустите Apache.

sudo service apache2 restart

Фильтрация логов Apache

На сервере logging откройте новый файл и добавьте в него фильтры Logstash для Apache.

Назовите его 12-apache.conf, чтобы он читался после файла 01-lumberjack-input.conf.

sudo vi /etc/logstash/conf.d/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 сможет фильтровать логи типа pache-access и apache-error с помощью шаблонов Grok, которые определены в директиве match. Логи типа apache-access обрабатываются с помощью шаблона Grok, который соответствует формату сообщения лога Apache по умолчанию; логи типа apache-error обрабатываются фильтром Grok, который соответствует формату лога ошибок по умолчанию.

Чтобы фильтры начали работать, перезапустите Logstash:

sudo service logstash restart

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

6: Логи HAProxy

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

Передача логов HAProxy

Теперь нужно настроить Logstash Forwarder для передачи логов HAProxy на сервер логирования.

Откройте конфигурационный файл Logstash Forwarder на сервере lb1.

sudo vi /etc/logstash-forwarder.conf

Добавьте следующие строки в конец раздела files.

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

Сохраните и закройте файл.

Теперь Logstash Forwarder передает логи HAProxy и присваивает им метку haproxy-log.

Перезапустите Logstash Forwarder:

sudo service logstash-forwarder restart

На сервере logging откройте новый файл и добавьте в него фильтры Logstash для HAProxy.

Назовите его 13-haproxy.conf, чтобы он читался после файла 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 обрабатываются с помощью шаблона Grok, который соответствует формату сообщения лога HAProxy по умолчанию.

Чтобы фильтры начали работать, перезапустите Logstash:

sudo service logstash restart

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

7: Визуализация логов с помощью Kibana

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

Читайте также:

Заключение

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

Пользователь

Балансировщик нагрузки
↓                ↓
Серверы приложений
Сервер 1                Сервер2
↓                          ↓
Сервер баз данных

_______________________
↓            ↓            ↓
Логирование      Мониторинг      Бэкап → План восстановления

Tags: , , ,