8 Anhang C

8.1 Loki

Loki kann als eigenständiger Dienst installiert werden. Dies kann durch das Herunterladen der Binärdateien oder die Verwendung eines Docker-Containers erfolgen.

8.1.1 Verwendung von Docker

docker run -d --name=loki -p 3100:3100 grafana/loki:2.8.1

8.1.2 Installation ohne Docker

  1. Herunterladen der Binärdateien von der offiziellen GitHub-Seite.
  2. Entpacken und Starten von Loki:
tar -zxvf loki-linux-amd64.zip
chmod a+x loki-linux-amd64
./loki-linux-amd64 -config.file=loki-config.yaml

8.2 Konfiguration von Loki

Eine 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: 0s

8.3 Integration mit Promtail

Promtail 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.

8.3.1 Installation von Promtail

8.3.1.1 Verwendung von Docker

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.yaml

8.3.1.2 Installation ohne Docker

  1. Herunterladen der Binärdateien von der offiziellen GitHub-Seite.
  2. Entpacken und Starten von Promtail:
tar -zxvf promtail-linux-amd64.zip
chmod a+x promtail-linux-amd64
./promtail-linux-amd64 -config.file=promtail-config.yaml

8.3.2 Konfiguration von Promtail

Eine 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/*log

8.4 Verwendung von Loki mit Grafana

Grafana kann verwendet werden, um Logs aus Loki zu visualisieren. Dies erfordert die Konfiguration einer Datenquelle in Grafana.

  1. Installiere und starte Grafana.
  2. Füge in Grafana eine neue Datenquelle hinzu:

8.5 Installation von Promtail auf Linux

8.5.1 Herunterladen und Installieren

  1. 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.zip
  2. Entpacken der Binärdateien:

    unzip promtail-linux-amd64.zip
    chmod a+x promtail-linux-amd64

8.5.2 Konfiguration von Promtail

Erstelle 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/*log

8.5.3 Starten von Promtail

Starte Promtail mit der Konfigurationsdatei:

./promtail-linux-amd64 -config.file=promtail-config.yaml

8.6 Detaillierte Schritte zur Konfiguration und Nutzung

8.6.1 1. Konfiguration der Clients

In 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/push

Ersetze <LOKI_SERVER> durch die IP-Adresse oder den Hostnamen deines Loki-Servers.

8.6.2 2. Konfiguration der Log-Pfade

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/*log

Du kannst die Pfade und Labels nach Bedarf anpassen.

8.6.3 3. Überprüfen der Logs

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.

8.6.3.1 Hinzufügen der Loki-Datenquelle in Grafana

  1. Grafana öffnen und einloggen.
  2. Datenquelle hinzufügen:

Nach der Konfiguration kannst du in Grafana Dashboards erstellen und die gesendeten Logs visualisieren.

8.7 Beispiel für eine erweiterte Promtail-Konfiguration

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/*.log

Diese Konfiguration sammelt Logs aus zwei verschiedenen Verzeichnissen (/var/log und /var/log/myapp) und weist ihnen unterschiedliche Jobs zu (varlogs und applogs).

8.8 Grundlagen von LogQL

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.

8.8.1 Log Stream Selektoren

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.

8.8.2 Filterausdrücke

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.

8.9 Operatoren in LogQL

LogQL bietet verschiedene Operatoren zum Filtern und Bearbeiten von Logs. Die wichtigsten Operatoren sind:

8.9.1 Text-Filter Operatoren

Beispiel:

{job="varlogs"} |~ "ERROR|WARN"

Dieser Ausdruck filtert Logs, die entweder “ERROR” oder “WARN” enthalten.

8.9.2 Pipeline-Schritte

Pipeline-Schritte ermöglichen es, Logs zu transformieren und zu aggregieren. Ein Pipeline-Schritt wird durch das Pipe-Symbol (|) eingeleitet.

8.9.2.1 Beispiel für Pipeline-Schritte

{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.

8.9.3 Aggregationsoperatoren

LogQL unterstützt verschiedene Aggregationsoperatoren zur Berechnung von Metriken basierend auf Log-Streams. Zu den wichtigsten Aggregationsoperatoren gehören:

Beispiel:

count_over_time({job="varlogs"}[5m])

Dieser Ausdruck zählt die Anzahl der Logs im Log-Stream varlogs über die letzten 5 Minuten.

8.10 Beispielabfragen

8.10.1 Fehlerlogs der letzten Stunde

{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.

8.10.2 Anzahl der Warnungen pro Minute

rate({job="varlogs", level="warn"}[1m])

Dieser Ausdruck berechnet die Rate der Warnungen pro Minute.

8.10.3 Durchschnittliche Dauer von Anfragen

{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.