Настройте управление журналами с помощью решения с открытым исходным кодом.
Зачем нам нужно управление журналами?
Допустим, вы запускаете свое приложение на выделенном сервере. Затем в вашем приложении произошла ошибка, вам нужно отладить ее, первое, что вы получите, это, скорее всего, файл журнала, вы будете искать трассировку стека приложения. Если ваше приложение не имеет большого трафика, то записи приложения в файл журнала и использования cat, tail и grep более чем достаточно, чтобы найти конкретный журнал, касающийся этой ошибки.
Но что случилось, когда логи разложили по нескольким файлам? Допустим, вы настроили ротацию журналов, при которой журнал будет обновляться каждые несколько часов, или был достигнут определенный размер файла. Одна и та же трассировка стека может быть разделена на несколько файлов, поиск трассировки стека в нескольких файлах журнала - трудоемкий процесс. Более того, в настоящее время наблюдается тенденция к использованию микросервисов: каждая служба будет записывать журнал в свой собственный файл журнала. Найти ошибку в файлах журнала служб - это такая проблема.
Управление журналами дает нам интерфейс для поиска одной и той же трассировки в нескольких файлах журнала, поскольку журнал записывается только в один файл.
Почему Графана Локи?
Существует несколько решений для управления журналами. У большинства из них есть бесплатная схема оплаты, но только до определенного предела, от 100 МБ до 100 ГБ. Grafana Loki - это решение с открытым исходным кодом. Следовательно, это бесплатно без каких-либо ограничений.
Еще одно популярное решение с открытым исходным кодом - стек ELK (Elasticsearch, Logstash и Kibana). Для его запуска нам нужна JVM, для работы которой неизбежно требуется много ресурсов. В документации Elastic говорится, что машина с памятью менее 8 ГБ имеет тенденцию быть контрпродуктивной.
С другой стороны, Grafana Loki может без проблем работать на относительно небольшом сервере. Я запускаю Grafana Loki на своем хобби-компьютере, который имеет только 2 ядра и 2 ГБ памяти без каких-либо сбоев уже более 2 лет.
Предварительное условие
Сервер Ubuntu под управлением Linux версии ≥18.04.
Шаги
1. Загрузите файлы конфигурации.
$ sudo mkdir /opt/loki $ cd /opt/loki $wget https://raw.githubusercontent.com/grafana/loki/master/cmd/loki/loki-local-config.yaml
$ wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml
Не забудьте изменить путь promtail-local-config.yaml к файлу журнала так, чтобы он указывал на журнал вашего приложения.
Если вы не можете загрузить файлы конфигурации, создайте их вручную, используя конфигурацию ниже.
promtail-local-config.yaml
server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://localhost:3100/loki/api/v1/push scrape_configs: - job_name: system static_configs: - targets: - localhost labels: job: varlogs __path__: /var/log/*log # modify to point at your application log file
loki-local-config.yaml
auth_enabled: false server: http_listen_port: 3100 grpc_listen_port: 9096 ingester: wal: enabled: true dir: /tmp/wal lifecycler: address: 127.0.0.1 ring: kvstore: store: inmemory replication_factor: 1 final_sleep: 0s chunk_idle_period: 1h # Any chunk not receiving new logs in this time will be flushed max_chunk_age: 1h # All chunks will be flushed when they hit this age, default is 1h chunk_target_size: 1048576 # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first chunk_retain_period: 30s # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m) max_transfer_retries: 0 # Chunk transfers disabled schema_config: configs: - from: 2020-10-24 store: boltdb-shipper object_store: filesystem schema: v11 index: prefix: index_ period: 24h storage_config: boltdb_shipper: active_index_directory: /tmp/loki/boltdb-shipper-active cache_location: /tmp/loki/boltdb-shipper-cache cache_ttl: 24h # Can be increased for faster performance over longer query periods, uses more disk space shared_store: filesystem filesystem: directory: /tmp/loki/chunks compactor: working_directory: /tmp/loki/boltdb-shipper-compactor shared_store: filesystem limits_config: reject_old_samples: true reject_old_samples_max_age: 168h chunk_store_config: max_look_back_period: 0s table_manager: retention_deletes_enabled: false retention_period: 0s ruler: storage: type: local local: directory: /tmp/loki/rules rule_path: /tmp/loki/rules-temp alertmanager_url: http://localhost:9093 ring: kvstore: store: inmemory enable_api: true
3. Скачайте Grafana Loki и Promtail.
$ wget https://github.com/grafana/loki/releases/download/v2.2.1/loki-linux-amd64.zip $ sudo unzip loki-linux-amd64.zip $ wget https://github.com/grafana/loki/releases/download/v2.2.1/promtail-linux-amd64.zip $ sudo unzip promtail-linux-amd64.zip
4. Убедитесь, что двоичные файлы и конфигурации существуют.
$ ls Output: root@arwego:/opt/loki# ls -l total 153964 -rwxr-xr-x 1 root root 53501952 Apr 6 07:55 loki-linux-amd64 -rw-r--r-- 1 root root 17277632 Apr 6 07:58 loki-linux-amd64.zip -rw-r--r-- 1 root root 1832 May 13 13:18 loki-local-config.yaml -rwxr-xr-x 1 root root 67333584 Apr 6 07:57 promtail-linux-amd64 -rw-r--r-- 1 root root 19522160 Apr 6 07:58 promtail-linux-amd64.zip -rw-r--r-- 1 root root 303 May 13 13:18 promtail-local-config.yaml
4. Настройте systemd для Promtail.
$ sudo cat <<EOF >/etc/systemd/system/promtail.service [Unit] Description=Promtail service After=network.target [Service] Type=simple #User=promtail ExecStart=/opt/loki/promtail-linux-amd64 -config.file /opt/loki/promtail-local-config.yaml Restart=always [Install] WantedBy=multi-user.target EOF $ sudo systemctl start promtail.service $ sudo systemctl enable promtail.service
5. Настройте systemd для Loki.
$ sudo cat <<EOF >/etc/systemd/system/loki.service [Unit] Description=Loki service After=network.target [Service] Type=simple #User=loki ExecStart=/opt/loki/loki-linux-amd64 -config.file /opt/loki/loki-local-config.yaml Restart=always [Install] WantedBy=multi-user.target EOF $ sudo systemctl start loki.service $ sudo systemctl enable loki.service
6. Убедитесь, что обе службы работают.
$ sudo systemctl status promtail Output: ● promtail.service - Promtail service Loaded: loaded (/etc/systemd/system/promtail.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-05-13 13:34:38 WIB; 1min 10s ago Main PID: 11234 (promtail-linux-) Tasks: 11 (limit: 19006) Memory: 36.3M CGroup: /system.slice/promtail.service └─11234 /opt/loki/promtail-linux-amd64 -config.file /opt/loki/promtail-local-config.yaml $ sudo systemctl status loki Output: ● loki.service - Loki service Loaded: loaded (/etc/systemd/system/loki.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2021-05-13 13:34:15 WIB; 2min 43s ago Main PID: 11194 (loki-linux-amd6) Tasks: 9 (limit: 19006) Memory: 66.0M CGroup: /system.slice/loki.service └─11194 /opt/loki/loki-linux-amd64 -config.file /opt/loki/loki-local-config.yaml $ curl http://localhost:3100/metrics Output: # HELP cortex_cache_corrupt_chunks_total Total count of corrupt chunks found in cache. # TYPE cortex_cache_corrupt_chunks_total counter cortex_cache_corrupt_chunks_total 0 # HELP cortex_chunk_store_chunks_per_query Distribution of #chunks per query. # TYPE cortex_chunk_store_chunks_per_query histogram cortex_chunk_store_chunks_per_query_bucket{le="10"} 0 cortex_chunk_store_chunks_per_query_bucket{le="80"} 0 ...
7. Установите Grafana.
$ sudo apt-get install -y apt-transport-https $ sudo apt-get install -y software-properties-common wget
$ wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
$ echo "deb https://packages.grafana.com/enterprise/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
$ sudo apt-get update $ sudo apt-get install grafana
$sudo systemctl daemon-reload $ sudo systemctl start grafana-server $ sudo systemctl enable grafana-server
8. Убедитесь, что Grafana запущена и работает.
$ sudo systemctl status grafana-server
Output:
● grafana-server.service - Grafana instance
Loaded: loaded (/lib/systemd/system/grafana-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-05-13 13:58:26 WIB; 1min 27s ago
Docs: http://docs.grafana.org
Main PID: 16311 (grafana-server)
Tasks: 10 (limit: 19006)
Memory: 17.0M
CGroup: /system.slice/grafana-server.service
$ curl http://localhost:3000
Output:
<a href="/login">Found</a>.
8. Зайдите в браузер и откройте http: // localhost: 3000 / login.
9. Войдите, используя учетные данные по умолчанию:
username: admin password: admin
10. Создайте новый пароль.
11. Перейдите на http: // localhost: 3000 / explore и добавьте новый источник данных.
12. Добавьте источник данных Loki.
13. Введите http: // localhost: 3100 в поле HTTP URL.
14. Щелкните Сохранить и проверить. Должно появиться зеленое всплывающее окно с сообщением, что источники данных подключены и ярлыки найдены.
15. Снова перейдите на http: // localhost: 3000 / explore. Ваш источник данных Loki должен появиться сейчас.
16. Введите {job = ”varlogs”} в поле запроса и запустите его, нажав CTRL + Enter или синюю кнопку в правом верхнем углу. Вы должны увидеть несколько журналов.
Вуаля, и мы закончили. Мы успешно настроили Grafana Loki для управления журналами.
Исправление проблем
Конфликтующий порт
Наиболее частая проблема - конфликтующий порт. Grafana работает на порту 3000, Loki работает на порту 3100, а Promtail работает на 9080. Убедитесь, что эти порты не заняты другими службами. Если он занят, вам нужно будет изменить конфигурацию на доступный порт и перезапустить службы.
Отсутствующий журнал
Наиболее частая проблема заключается в том, что вы забываете обновить путь к файлу promtail-local-config.yaml, чтобы он указывал на журнал приложения. Другая распространенная проблема, ваше приложение на самом деле не записывает никаких журналов в файл журнала.
Понимание синтаксиса запроса
Он использует Grafana LogQL. Подробнее об этом вы можете узнать здесь.
использованная литература
- Графана Локи: https://grafana.com/docs/loki/latest/
- Grafana LogQL: https://grafana.com/docs/loki/latest/logql/
- Спецификация оборудования для ELK: https://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html