 Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Grafana Loki — agregacja logów

# Grafana Loki — agregacja logów z promtail i LogQL

Opublikowano: 10 kwietnia 2026 · Kategoria: VPS / Monitoring

Gdy masz kilka serwisów na VPS — Nginx, PHP-FPM, WordPress, Docker — logi rozjeżdżają się po różnych katalogach i szukanie błędu zamienia się w polowanie z grep. Grafana Loki rozwiązuje ten problem: agreguje logi z wszystkich źródeł, indeksuje je po etykietach (nie po treści) i pozwala odpytywać przez LogQL w tym samym UI co Prometheus. Ten artykuł pokazuje pełną instalację Loki + Promtail + Grafana w Docker Compose oraz praktyczne zapytania LogQL.

## Dlaczego Loki zamiast ELK?

Klasyczny ELK Stack (Elasticsearch + Logstash + Kibana) indeksuje każde pole każdego logu, co daje szybkie full-text search, ale kosztuje dużo RAM i dysku. Na VPS z 2 GB RAM Elasticsearch po prostu się nie uruchomi — minimum to 1 GB heap + bufory = realnie 2 GB. Loki działa odwrotnie: indeksuje tylko **labels** (nazwa joba, host, level), a samą treść logu trzyma w paczkach gzip. Wynik: typowy Loki + Promtail zużywa 300-500 MB RAM i mieści się na VPS-ie za 25 PLN miesięcznie.

## Instalacja Loki w Docker Compose

Najszybszy sposób uruchomienia stosu Loki + Promtail + Grafana to jeden plik `docker-compose.yml`. Wszystkie trzy komponenty dzielą jedną sieć Dockera.

\# /opt/loki-stack/docker-compose.yml
version: "3.8"

services:
  loki:
    image: grafana/loki:2.9.0
    container\_name: loki
    restart: unless-stopped
    ports:
      - "127.0.0.1:3100:3100"
    volumes:
      - ./loki-config.yaml:/etc/loki/local-config.yaml:ro
      - loki-data:/loki
    command: -config.file=/etc/loki/local-config.yaml

  promtail:
    image: grafana/promtail:2.9.0
    container\_name: promtail
    restart: unless-stopped
    volumes:
      - ./promtail-config.yaml:/etc/promtail/config.yaml:ro
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
    command: -config.file=/etc/promtail/config.yaml
    depends\_on:
      - loki

  grafana:
    image: grafana/grafana:10.2.0
    container\_name: grafana
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      - GF\_SECURITY\_ADMIN\_PASSWORD=zmien\_to\_haslo
      - GF\_USERS\_ALLOW\_SIGN\_UP=false
    volumes:
      - grafana-data:/var/lib/grafana
    depends\_on:
      - loki

volumes:
  loki-data:
  grafana-data:

\# loki-config.yaml — minimalna konfiguracja (filesystem storage)
auth\_enabled: false

server:
  http\_listen\_port: 3100

common:
  path\_prefix: /loki
  storage:
    filesystem:
      chunks\_directory: /loki/chunks
      rules\_directory: /loki/rules
  replication\_factor: 1
  ring:
    kvstore:
      store: inmemory

schema\_config:
  configs:
    - from: 2024-01-01
      store: boltdb-shipper
      object\_store: filesystem
      schema: v12
      index:
        prefix: index\_
        period: 24h

limits\_config:
  retention\_period: 720h  # 30 dni
  max\_query\_length: 721h

compactor:
  working\_directory: /loki/compactor
  retention\_enabled: true
  delete\_request\_store: filesystem

## Promtail — zbieranie logów z plików i Dockera

Promtail to agent, który czyta pliki logów (ogonem, jak `tail -f`) i wysyła je do Loki. Konfiguracja deklaruje _scrape jobs_ — podobnie jak w Prometheusie. Każdy job dostaje unikalne labels, które potem filtrujesz w LogQL.

\# promtail-config.yaml
server:
  http\_listen\_port: 9080
  grpc\_listen\_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape\_configs:
  # Nginx access + error log
  - job\_name: nginx
    static\_configs:
      - targets:
          - localhost
        labels:
          job: nginx
          host: vps-production
          \_\_path\_\_: /var/log/nginx/\*.log

  # PHP-FPM slow log + error
  - job\_name: php-fpm
    static\_configs:
      - targets:
          - localhost
        labels:
          job: php-fpm
          host: vps-production
          \_\_path\_\_: /var/log/php\*-fpm.log

  # Systemd journal (wymaga socket mount)
  - job\_name: journal
    journal:
      max\_age: 12h
      labels:
        job: systemd-journal
    relabel\_configs:
      - source\_labels: \["\_\_journal\_\_systemd\_unit"\]
        target\_label: unit

  # Logi kontenerów Docker
  - job\_name: docker
    docker\_sd\_configs:
      - host: unix:///var/run/docker.sock
        refresh\_interval: 5s
    relabel\_configs:
      - source\_labels: \["\_\_meta\_docker\_container\_name"\]
        target\_label: container

## LogQL — zapytania do logów

LogQL składa się z **selektora labels** (co zwrócić) oraz **filtrów treści** (czego szukać w liniach). Selektor jest obowiązkowy — minimum jedna label. Filtry są opcjonalne i można je łączyć w łańcuch.

\# Wszystkie logi Nginxa
{job="nginx"}

# Tylko błędy 5xx z access log
{job="nginx", filename="/var/log/nginx/access.log"} |~ " 5\\\\d\\\\d "

# Logi PHP-FPM zawierające "Out of memory"
{job="php-fpm"} |= "Out of memory"

# Kombinacja: Nginx error log, bez wpisów o favicon
{job="nginx"} |= "error" != "favicon.ico"

# Regex match: 4xx lub 5xx
{job="nginx"} |~ " \[45\]\\\\d\\\\d "

# Agregacja: liczba błędów 500 na sekundę w ostatnich 5 minutach
rate({job="nginx"} |~ " 500 " \[5m\])

# Top 5 kontenerów z największą liczbą logów
topk(5, sum by (container) (rate({job="docker"} \[5m\])))

## Loki vs ELK Stack — porównanie

Kryterium

Grafana Loki

ELK Stack

Zużycie RAM (min)

300-500 MB

2-4 GB

Indeksowanie

Tylko labels (metadane)

Każde pole + full-text

Full-text search

Grep po bloku (wolniejsze)

Natywny inverted index

Storage backend

Filesystem, S3, GCS

Elasticsearch (własny format)

Język zapytań

LogQL (PromQL-like)

Lucene / KQL

UI

Grafana (współdzielone z metrykami)

Kibana (osobne)

Koszt storage

Niski (gzip, tanie obiektowe)

Wysoki (index + source)

Idealne dla

Małe/średnie VPS, cloud-native

Duże klastry, zaawansowany search

## Dashboard Grafana + retention

Po uruchomieniu stosu otwórz `http://twoj-vps:3000`, zaloguj się jako `admin` i dodaj data source typu **Loki** z URL `http://loki:3100`. Zakładka _Explore_ pozwala testować LogQL na żywo. Gotowe dashboardy dla Nginxa, Dockera i systemd są dostępne na [grafana.com/dashboards](https://grafana.com/grafana/dashboards) — szukaj tagu `loki`.

Retention 30 dni na średnim VPS zajmuje typowo 2-5 GB (po kompresji). Dla 90 dni licz 10-15 GB. Jeśli miejsce zaczyna się kończyć, przełącz `object_store` z `filesystem` na `s3` i wyślij logi do Backblaze B2 lub MinIO — Loki natywnie to wspiera i odczytuje chunki przez HTTP range requests.

## Najczęstsze pytania

Czym różni się Loki od Elasticsearch? +

Loki indeksuje wyłącznie metadane logów (labels) i przechowuje surową treść w tanim obiekcie (S3, filesystem). Elasticsearch indeksuje każde pole i każde słowo, co daje szybsze full-text, ale kosztem 5-10x większego zużycia RAM i dysku. Loki zużywa typowo 300-500 MB RAM na małym VPS, Elasticsearch często 2-4 GB RAM minimum. Loki wystarczy, gdy logi przeglądasz filtrując po źródle/poziomie/kontenerze — Elasticsearch jest lepszy, gdy potrzebujesz full-text search po treści logów.

Jak działa LogQL? +

LogQL to język zapytań Loki zainspirowany PromQL. Składa się z dwóch części: selektora labels (np. {job="nginx", level="error"}) oraz opcjonalnego filtra treści (|= "timeout" lub |~ "5\\d\\d"). Możesz też agregować wartości w czasie — np. rate({job="nginx"} |~ "500" \[5m\]) zwraca liczbę błędów 500 na sekundę. LogQL obsługuje też sum by (label), topk, histogram\_quantile — podobnie jak Prometheus.

Co to jest Promtail? +

Promtail to lekki agent (Go binary), który zbiera logi z plików lub dziennika systemd i wysyła je do Loki. Konfiguruje się YAML — deklarujesz scrape\_configs podobne do Prometheusa, gdzie każdy job ma listę ścieżek (\_\_path\_\_) i statyczne labels. Promtail czyta logi ogonem (jak tail -f), dodaje labels, opcjonalnie parsuje linie (pipeline\_stages) i wysyła do Loki. Alternatywy: Fluent Bit, Vector, Grafana Alloy — wszystkie wspierają Loki protocol.

Jak długo Loki przechowuje logi? +

Retention konfigurujesz w loki-config.yaml w sekcji limits\_config (retention\_period) oraz compactor (delete\_request\_store). Domyślnie Loki nie usuwa logów — musisz jawnie włączyć retention\_enabled: true w compactor. Typowe wartości: 168h (7 dni) dla developmentu, 720h (30 dni) dla produkcji, 2160h (90 dni) gdy wymaga tego audyt. Im dłuższa retencja, tym większe zużycie storage (ale Loki kompresuje logi do ~10% oryginału dzięki gzip).

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS z dużą pamięcią RAM — Loki + Grafana + Promtail na jednym hoście

VPS

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

Mikrus

Tani VPS do testowania stosu Loki/Grafana przed wdrożeniem na produkcji

Dev/Test

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

LH.pl

Hosting z gotowym dostępem do logów — bez własnego stosu agregacji

Managed

[Aktywuj rabat →](/out/lh-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/lh-pl)

## Powiązane strony

-   [Monitoring uptime — UptimeRobot](/baza-wiedzy/monitorowanie-strony-uptime-robot)
-   [Nginx virtual host — konfiguracja](/baza-wiedzy/nginx-vhost-konfiguracja)
-   [Docker na VPS — instalacja i zarządzanie](/baza-wiedzy/docker-na-vps)
-   [Logrotate — rotacja logów w Linuxie](/baza-wiedzy/logrotate-konfiguracja-linux)
-   [Wszystkie artykuły](/baza-wiedzy/)