Loki kann als eigenständiger Dienst installiert werden. Dies kann durch das Herunterladen der Binärdateien oder die Verwendung eines Docker-Containers erfolgen.
docker run -d --name=loki -p 3100:3100 grafana/loki:2.8.1tar -zxvf loki-linux-amd64.zip
chmod a+x loki-linux-amd64
./loki-linux-amd64 -config.file=loki-config.yamlEine Konfigurationsdatei (loki-config.yaml) wird
benötigt, um Loki korrekt einzurichten. Ein Beispiel für eine minimale
Konfiguration könnte wie folgt aussehen:
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 3m
chunk_retain_period: 1m
max_transfer_retries: 0
schema_config:
configs:
- from: 2020-10-24
store: boltdb
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb:
directory: /tmp/loki/index
filesystem:
directory: /tmp/loki/chunks
limits_config:
enforce_metric_name: false
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: 0sPromtail ist der empfohlene Log-Collector für Loki. Promtail kann Logs von verschiedenen Quellen sammeln und an Loki senden. Promtail kann ebenfalls ohne Kubernetes verwendet werden.
docker run -d --name=promtail -v /var/log:/var/log -v /etc/promtail:/etc/promtail grafana/promtail:2.8.1 -config.file=/etc/promtail/promtail-config.yamltar -zxvf promtail-linux-amd64.zip
chmod a+x promtail-linux-amd64
./promtail-linux-amd64 -config.file=promtail-config.yamlEine Beispielkonfiguration für Promtail
(promtail-config.yaml) könnte wie folgt aussehen:
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/*logGrafana kann verwendet werden, um Logs aus Loki zu visualisieren. Dies erfordert die Konfiguration einer Datenquelle in Grafana.
http://localhost:3100.Herunterladen der Binärdateien:
Lade die neueste Version von Promtail von der offiziellen GitHub-Seite herunter. Zum Beispiel:
wget https://github.com/grafana/loki/releases/download/v2.8.1/promtail-linux-amd64.zipEntpacken der Binärdateien:
unzip promtail-linux-amd64.zip
chmod a+x promtail-linux-amd64Erstelle eine Konfigurationsdatei namens
promtail-config.yaml. Hier ist ein Beispiel für eine
Konfiguration, die System-Logs von /var/log sammelt und an
Loki sendet:
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/*logStarte Promtail mit der Konfigurationsdatei:
./promtail-linux-amd64 -config.file=promtail-config.yamlIn der Konfigurationsdatei von Promtail ist der Abschnitt
clients wichtig, um die URL deines Loki-Servers
anzugeben:
clients:
- url: http://<LOKI_SERVER>:3100/loki/api/v1/pushErsetze <LOKI_SERVER> durch die IP-Adresse oder
den Hostnamen deines Loki-Servers.
Der Abschnitt scrape_configs definiert, welche Logs
gesammelt werden sollen. In diesem Beispiel wird
/var/log/*log verwendet:
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*logDu kannst die Pfade und Labels nach Bedarf anpassen.
Nach dem Start von Promtail sollten die Logs in Loki verfügbar sein. Du kannst in Grafana eine neue Datenquelle hinzufügen und die Logs visualisieren.
Configuration >
Data Sources.Add data source.Loki aus der Liste.http://localhost:3100.Save & Test, um die Verbindung zu
überprüfen.Nach der Konfiguration kannst du in Grafana Dashboards erstellen und die gesendeten Logs visualisieren.
Für eine komplexere Konfiguration, die Logs aus mehreren Verzeichnissen sammelt und mit verschiedenen Labels versieht, könnte deine Konfigurationsdatei so aussehen:
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
- job_name: application
static_configs:
- targets:
- localhost
labels:
job: applogs
__path__: /var/log/myapp/*.logDiese Konfiguration sammelt Logs aus zwei verschiedenen
Verzeichnissen (/var/log und /var/log/myapp)
und weist ihnen unterschiedliche Jobs zu (varlogs und
applogs).
LogQL ist die Abfragesprache von Loki, die speziell für die effiziente Suche, Filterung und Analyse von Logs entwickelt wurde. Dieser Artikel bietet eine detaillierte Einführung in LogQL, einschließlich der grundlegenden Syntax, der verfügbaren Operatoren und Beispiele für typische Anwendungsfälle.
LogQL basiert auf zwei Hauptkomponenten: Log Stream Selektoren und Filterausdrücke.
Ein Log Stream Selektor definiert die Log-Streams, die für eine Abfrage relevant sind. Er besteht aus einem Label-Selektor, der die gewünschten Labels und deren Werte spezifiziert.
Beispiel:
{job="varlogs", level="error"}
Dieser Selektor wählt alle Log-Streams aus, die das Label
job mit dem Wert varlogs und das Label
level mit dem Wert error haben.
Filterausdrücke werden verwendet, um die Ergebnisse weiter zu filtern. Sie können einfache Textübereinstimmungen oder reguläre Ausdrücke enthalten.
Beispiel:
{job="varlogs", level="error"} |= "timeout"
Dieser Ausdruck filtert die zuvor ausgewählten Logs weiter und gibt nur diejenigen zurück, die den Text “timeout” enthalten.
LogQL bietet verschiedene Operatoren zum Filtern und Bearbeiten von Logs. Die wichtigsten Operatoren sind:
|= "text": Filtert Logs, die den angegebenen Text
enthalten.!= "text": Filtert Logs, die den angegebenen Text nicht
enthalten.|~ "regex": Filtert Logs, die mit dem angegebenen
regulären Ausdruck übereinstimmen.!~ "regex": Filtert Logs, die nicht mit dem angegebenen
regulären Ausdruck übereinstimmen.Beispiel:
{job="varlogs"} |~ "ERROR|WARN"
Dieser Ausdruck filtert Logs, die entweder “ERROR” oder “WARN” enthalten.
Pipeline-Schritte ermöglichen es, Logs zu transformieren und zu
aggregieren. Ein Pipeline-Schritt wird durch das Pipe-Symbol
(|) eingeleitet.
{job="varlogs"} |= "error" | logfmt | duration > 1s
Dieser Ausdruck filtert zuerst Logs, die “error” enthalten, parst
dann die Logs im logfmt-Format und filtert schließlich nach
Logs, bei denen die Dauer (duration) größer als eine
Sekunde ist.
LogQL unterstützt verschiedene Aggregationsoperatoren zur Berechnung von Metriken basierend auf Log-Streams. Zu den wichtigsten Aggregationsoperatoren gehören:
count(): Zählt die Anzahl der Logs.rate(): Berechnet die Rate von Logs pro
Zeiteinheit.avg(): Berechnet den Durchschnittswert eines
Feldes.max(), min(): Bestimmt den maximalen bzw.
minimalen Wert eines Feldes.Beispiel:
count_over_time({job="varlogs"}[5m])
Dieser Ausdruck zählt die Anzahl der Logs im Log-Stream
varlogs über die letzten 5 Minuten.
{job="varlogs", level="error"} |= "timeout" | line_format "{{.message}}"
Dieser Ausdruck filtert Fehlerlogs, die das Wort “timeout” enthalten, und formatiert die Ausgabe nur mit dem Nachrichtenfeld.
rate({job="varlogs", level="warn"}[1m])
Dieser Ausdruck berechnet die Rate der Warnungen pro Minute.
{job="applogs"} |= "request_duration" | json | avg(rate(request_duration[1m]))
Dieser Ausdruck filtert Logs, die request_duration
enthalten, parst die Logs im JSON-Format und berechnet den Durchschnitt
der Anfrage-Dauer über eine Minute.