Настройте управление журналами с помощью решения с открытым исходным кодом.

Зачем нам нужно управление журналами?

Допустим, вы запускаете свое приложение на выделенном сервере. Затем в вашем приложении произошла ошибка, вам нужно отладить ее, первое, что вы получите, это, скорее всего, файл журнала, вы будете искать трассировку стека приложения. Если ваше приложение не имеет большого трафика, то записи приложения в файл журнала и использования 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. Подробнее об этом вы можете узнать здесь.

использованная литература