Loki ne indeksira tekst logova, nego samo labele. Zato upit uvek počinje izborom labela u vitičastim zagradama {...}, pa tek onda filtriraš tekst. Što preciznije labele — to brži upit.
Tvoje labele (svaki log ima neke od ovih):
| Labela | Značenje | Primeri vrednosti kod tebe |
|---|---|---|
host | mašina | ubuntu88 (za sada jedina) |
job | odakle je log došao | docker, files, nginx, systemd-journal |
service_name | ime servisa — ovo koristi najčešće | radarr, plex, jellyfin, nextcloud, nginx, ssh.service... |
container | ime Docker kontejnera | radarr, uptime-kuma, crypto_scanner-db-1... |
compose_project | docker compose projekat | observability, crypto_scanner... |
unit | systemd jedinica (za systemd-journal) | ssh.service, snap.mosquitto.mosquitto.service, cron.service |
level | nivo iz journal-a / nextcloud-a | err, warning, info, error... |
log_type | vrsta fajla | nginx: access/error; nextcloud: app/error/access/script |
stream | stdout ili stderr kontejnera | stdout, stderr |
Pored labela, Loki sam prepoznaje nivo svake linije i stavlja ga u polje detected_level (error, warn, info, debug...). To nije labela nego "structured metadata", pa se piše posle |.
Kucaj u Explore → izvor Loki → prebaci na Code režim.
{service_name="radarr"} svi logovi radarr-a
{container=~"crypto_scanner.*"} svi kontejneri čije ime počinje sa crypto_scanner (=~ je regex)
{job="systemd-journal", unit="ssh.service"} SSH prijave
{job="nginx", log_type="error"} nginx greške
{service_name="nextcloud", log_type="app"} Nextcloud aplikacioni log
{host="ubuntu88", service_name!="nginx"} sve osim nginx-a (!= je "nije"){service_name="plex"} |= "error" linije koje SADRŽE "error" (razlikuje velika/mala slova)
{service_name="plex"} |~ "(?i)error|fail" regex, (?i) = ne gleda velika/mala slova
{service_name="plex"} != "healthcheck" izbaci linije sa "healthcheck"
{job="systemd-journal"} |= "Failed with result" pali systemd servisi
{container="uptime-kuma"} |= "Failing" Kuma monitori koji padaju{host="ubuntu88"} | detected_level="error"
{host="ubuntu88", job!="nginx"} | detected_level=~"error|fatal|critical"Ovaj drugi je tačno upit na kom radi tvoj alarm "Greske u logovima".
count_over_time({service_name="radarr"} [5m])
koliko linija je radarr upisao u svakih 5 minuta
sum by (service_name) (count_over_time({host="ubuntu88"} | detected_level="error" [1h]))
broj grešaka po servisu, po satu
topk(10, sum by (service_name) (count_over_time({host="ubuntu88"} | detected_level="error" [24h])))
10 servisa sa najviše grešaka u poslednja 24h
sum by (job) (count_over_time({host="ubuntu88"} [5m]))
koliko logova stiže iz svakog izvora (ako docker padne na 0 — sakupljač ne radi)U Explore za ovakve upite stavi Query type: Range i dobićeš grafikon kroz vreme.
nginx access log nema strukturu, ali ima uvek isti oblik pa ga pattern rastavlja:
sum by (status) (count_over_time({job="nginx", log_type="access"}
| pattern `<_> - <_> [<_>] "<_> <_> <_>" <status> <_>` [1h]))To daje broj odgovora po HTTP statusu (200, 404, 502...) po satu. Za JSON logove (npr. Nextcloud) postoji | json, za key=value logove | logfmt — posle njih polja možeš da filtriraš: | json | user="kimi".
{service_name="whisparr"} | detected_level="error"
whisparr i collabora su trenutno najglasniji (~1000 grešaka dnevno svaki) — dobar prvi zadatak da vidiš zašto
{container="uptime-kuma"} |= "Failing"
koji Kuma monitori padaju i koliko često
{job="systemd-journal", unit="ssh.service"} |= "Accepted"
ko se i kad prijavio preko SSH-a
{job="nginx", log_type="access"} |= " 502 "
zahtevi na koje je nginx odgovorio 502 (servis iza njega ne radi)| Simptom | Uzrok | Rešenje |
|---|---|---|
| "No data" | Vremenski opseg prekratak, ili logovi stariji od 14 dana | Proširi opseg gore desno |
parse error | Navodnici: vrednosti labela idu u dvostruke navodnike; regex sa obrnutom kosom crtom ide u backtick navodnike | Prepiši navodnike |
| Upit je spor ili "too many outstanding requests" | Selektor {host="ubuntu88"} vuče sve | Suzi na service_name / job i kraći opseg |
detected_level ne radi u selektoru | Nije labela | Piši ga posle vitičastih zagrada, iza uspravne crte (primer 3 gore) |
Upit sa count_over_time vraća listu umesto grafika | Query type je Instant | Prebaci na Range |
count_over_time, rate, sum by): https://grafana.com/docs/loki/latest/query/metric_queries/Sledeće: 4. Dashboard i statistike