Zum Hauptinhalt springen

Zentralisiertes Logging mit Loki

Mit zentralisiertem Logging kannst du alle deine 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 findest du auf runway.

Pods mit Labels versehen

Sofern dein 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, öffne das Grafana UI und klicke auf Explore in der Leiste auf der linken Seite oder nutze 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, schau dir die Loki Dokumentation an.

Benutzerdefinierte Logs pushen

Solltest du Container haben, welche ihre Log Informationen in Dateien und nicht auf STDOUT schreiben, so kannst du einen beliebigen Loki client nutzen um Logs zu pushen. Ein Beispiel, wie das ganze aussehen könnte findest du 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 stelle sicher, dass die <LOKI_SERVICE_ADDRESS> mit der Adresse, welche du auf runway findest, 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 du Logs von externen System (wie bspw. einem externen Kubernetes Cluster) in deine Loki Instanz senden wollen, so können wir einen durch basic auth gesicherten Ingress erstellen, welcher die eingehenden Daten an deine Instanz weiterleitet. Du kannst dann fluent-bit oder promtail nutzen um die Logs zu pushen. Bitte kontaktiere den Support, um dieses Feature nutzen zu können.