Zurück zur Startseite

Zentralisiertes Logging mit Loki

Mit zentralisiertem Logging können Sie alle Ihre Container Logs an einem Ort ansehen und mit Hilfe von Grafana Loki durchsuchen

Details

Loki ist ein Log-Aggregierungssystem inspiriert von Prometheus. Es indexiert dabei nicht den kompletten Inhalt der Logs, sondern nur einzelne Labels für jeden Log Stream. Die Logs werden für 90 Tage aufbewahrt.

Verfügbarkeit

Zentralisiertes Logging ist standardmässig Teil von nine Managed GKE.

Nutzung

Loki kann über das Grafana Web UI genutzt werden. Die Login Details finden Sie auf runway.

Pods mit Labels versehen

Sofern Ihr Pod ein Teil eines Deployments, Statefulset oder eines anderen Controllers ist, werden die Logs automatisch von Loki aufgenommen. Wir empfehlen die “common Labels” zu setzen um die Logs einfacher zu finden.

Sofern ein einzelner Pod gestartet wird, benötigt ein Pod mindestens eines dieser Labels um von Loki gefunden zu werden:

  • app
  • name

Logs Abfragen mit LogQL

Die Query-Sprache von Loki nennt sich LogQL. Um die Logs abzufragen, öffnen Sie das Grafana UI und klicken Sie auf Explore in der Leiste auf der linken Seite oder nutzen Sie den direkten Link der auf runway zur Verfügung gestellt wird.

Ein LogQL Query besteht aus zwei Teilen: Dem Log Stream Selector und einem Such-Ausdruck. Ein Stream kann ausgewählt werden indem man ein oder mehrere Labels angibt:

{app="nginx", name=~"frontend.+"}

Um den Stream jetzt nach einer gewissen Zeichenfolge zu durchsuchen, kann ein Such-Ausdruck verwendet werden. Dies kann eine einfache Übereinstimmung sein mit |= oder ein Regulärer Ausdruck mit Hilfe von |~. Das ganze kann auch negiert werden, indem anstellt der Pipe ein ! verwendet wird. Hier ein paar Beispiele:

{app="nginx"} |= "GET"
{app="nginx"} |~ "200|201|202"
{app="nginx"} != "GET"
{app="nginx"} !~ "200|201|202"

Für mehr Details zu LogQL, schauen Sie sich die Loki Dokumentation an.

Benutzerdefinierte Logs pushen

Sollten Sie Container haben, welche ihre Log Informationen in Dateien und nicht auf STDOUT schreiben, so können Sie einen beliebigen Loki client nutzen um Logs zu pushen. Ein Beispiel, wie das ganze aussehen könnte finden Sie weiter unten. In dem Beispiel wird fluent-bit mit dem Loki Plugin als Sidecar zu einem Nginx Container genutzt um zusätzliche Log-Dateien an Loki zu senden. Bitte stellen Sie sicher, dass die <LOKI_SERVICE_ADDRESS> mit der Addresse, welche Sie auf runway finden können, ersetzt wird. Der Log-Pfad, das Format und die Labels werden mittels Umgebungsvariablen in der Pod Spec an fluent-bit überreicht. Mehr Informationen Über das Fluent Bit Loki plugin.

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-loki
data:
  fluent-bit.conf: |-
    [INPUT]
        Name tail
        Path ${LOG_PATH}
    [Output]
        Name loki
        Match *
        Url http://<LOKI_SERVICE_ADDRESS>:3100/loki/api/v1/push
        BatchWait 1
        BatchSize 1001024
        Labels {app="${APP_LABEL}",pod="${POD_NAME}",namespace="${POD_NAMESPACE}"}
        LineFormat ${LOG_FORMAT}
        LogLevel info
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
      - name: fluent-bit-config
        configMap:
          name: fluent-bit-loki
      - name: logs
        emptyDir: {}
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        volumeMounts:
        - name: logs
          mountPath: /var/log/nginx
      - name: fluent-bit-loki
        image: grafana/fluent-bit-plugin-loki:v0.4.0-amd64
        volumeMounts:
        - name: fluent-bit-config
          mountPath: /fluent-bit/etc
        - name: logs
          mountPath: /var/log/nginx
        env:
        - name: APP_LABEL
          value: nginx
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: LOG_PATH
          value: /var/log/nginx/*.log
        - name: LOG_FORMAT
          value: key_value

Externe Logs pushen

Falls Sie Logs von externen System (wie bspw. einem externen Kubernetes Cluster) in Ihre Loki Instanz senden wollen, so können wir einen durch basic auth gesicherten Ingress erstellen, welcher die eingehenden Daten an Ihre Instanz weiterleitet. Sie können dann fluent-bit oder promtail nutzen um die Logs zu pushen. Bitte kontaktieren Sie den Support um dieses Feature nutzen zu können.

Haben Sie die gewünschten Informationen nicht gefunden?

Kontaktieren Sie unseren Support:

+41 44 637 40 40 Support Portal support@nine.ch