Разработка и производство веб-приложений: централизованное логирование
Linux, PHP | Комментировать запись
Теперь можно настроить централизованное логирование серверов производства.
Централизованное логирование – отличный способ собирать и визуализировать логи серверов. Как правило, сложная система логирования не так важна, как резервные копии и мониторинг, но она может пригодиться при попытке определить тенденции или проблемы приложения.
Данное руководство поможет установить стек 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
↓ ↓
Сервер баз данных
↓
_______________________
↓ ↓ ↓
Логирование Мониторинг Бэкап → План восстановления