Вступление
Мы наконец-то готовы настроить централизованное ведение журналов для настройки нашего производственного приложения. Централизованное ведение журнала является отличным способом для сбора и визуализации журналов ваших серверов. Как правило, настройка сложной системы ведения журналов не так важна, как создание надежных резервных копий и мониторинг, но она может быть очень полезна при попытке выявить тенденции или проблемы с вашим приложением.
изображение: 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 [Настройка производства]
То есть у вас должно быть работающее приложение с отделенными компонентами, которое поддерживается компонентами резервного копирования, мониторинга и централизованного ведения журнала. Обязательно протестируйте свое приложение и убедитесь, что все компоненты работают должным образом.