GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verbessern Sie Ihren Shell-Verlauf mit Loki und fzf

Loki ist ein Apache 2.0-lizenziertes Open-Source-Protokollaggregations-Framework, das von Grafana Labs entwickelt und mit enormer Unterstützung einer wachsenden Community entwickelt wurde. Es ist auch das Projekt, an dem ich jeden Tag arbeite. In diesem Artikel werde ich nicht nur darüber sprechen, wie Loki funktioniert, sondern eine praktische Einführung in die Lösung echter Probleme damit geben.

Das Problem:eine dauerhafte zentralisierte Shell-Historie

Ich liebe meine Shell-Geschichte und war schon immer ein fanatischer STRG+R-Benutzer. Vor ungefähr einem Jahr änderte sich mein Terminalleben für immer, als mein Kollege Dieter Plaetinck mir den Befehlszeilen-Fuzzy-Finder fzf vorstellte .

Plötzlich ging die Suche nach Befehlen von hier aus:

Dazu:

Während fzf meine Lebensqualität erheblich verbesserte, fehlten noch einige Teile in meiner Shell-Geschichte:

  • Verlust des Shell-Verlaufs, wenn Terminals abrupt geschlossen werden, Computer abstürzen, Computer ausfallen, Verschlüsselungsschlüssel für ganze Festplatten vergessen werden
  • Zugriff auf meinen Shell-Verlauf haben von alle meine Computer an alle meine Computer

Ich betrachte meine Shell-Geschichte als Dokumentation:Es ist eine wichtige Geschichte, die ich nicht verlieren möchte. Die Kombination von Loki mit meinem Shell-Verlauf hilft, diese Probleme und mehr zu lösen.

Über Loki

Entdecken Sie die Open-Source-Cloud

  • Wolken verstehen
  • Kostenloser Online-Kurs:Entwicklung cloudnativer Anwendungen mit Microservices-Architekturen
  • Was ist eine Hybrid Cloud?
  • eBook:Aufbau einer Hybrid-Cloud-Strategie
  • Was ist Kubernetes?
  • Edge-Computing verstehen
  • Neueste Artikel für IT-Architekten

Loki nimmt das intuitive Bezeichnungsmodell, das das Open-Source-Prometheus-Projekt für Metriken verwendet, und erweitert es in die Welt der Protokollaggregation. Auf diese Weise können Entwickler und Betreiber nahtlos zwischen ihren Metriken und Protokollen wechseln, indem sie dieselben Labels verwenden. Auch wenn Sie Prometheus nicht verwenden, gibt es noch viele Gründe, warum Loki gut zu Ihren Anforderungen an die Protokollspeicherung passen könnte:

  • Geringer Overhead: Loki führt keine Volltext-Protokollindizierung durch; Es erstellt nur einen Index der Etiketten, die Sie Ihren Protokollen hinzufügen. Das Beibehalten eines kleinen Index reduziert die Betriebsanforderungen von Loki erheblich. Ich führe mein Loki-Shell-Projekt, das Loki zum Speichern des Shell-Verlaufs verwendet, auf einem Raspberry Pi aus, das nur etwas mehr als 50 MB Speicher verwendet.
  • Geringe Kosten: Der Protokollinhalt wird komprimiert und in Objektspeichern wie Amazon S3, Google Cloud Storage, Azure Blob oder sogar direkt in einem Dateisystem gespeichert. Das Ziel ist es, Speicher zu verwenden, der kostengünstig und langlebig ist.
  • Flexibilität: Loki ist in einer einzelnen Binärdatei verfügbar, die heruntergeladen und direkt oder als Docker-Image zur Ausführung in einer beliebigen Containerumgebung ausgeführt werden kann. Für den schnellen Einstieg in Kubernetes steht ein Helm-Diagramm zur Verfügung. Wenn Sie viel von Ihren Logging-Tools verlangen, werfen Sie einen Blick auf das Produktions-Setup, das bei Grafana Labs läuft. Es verwendet Open-Source-Jsonnet und Tanka, um dasselbe Loki-Image als diskrete Bausteine ​​bereitzustellen, um eine massive horizontale Skalierung, hohe Verfügbarkeit, Replikation, separate Skalierung von Lese- und Schreibpfaden, hochgradig parallelisierbare Abfragen und mehr zu ermöglichen.

Zusammenfassend besteht der Ansatz von Loki darin, einen kleinen Index von Metadaten über Ihre Protokolle (Labels) zu führen und den nicht indizierten und komprimierten Protokollinhalt in kostengünstigen Objektspeichern zu speichern, um den Betrieb einfacher und billiger zu machen. Die Anwendung ist so konzipiert, dass sie als einzelner Prozess ausgeführt wird und sich leicht zu einem hochverfügbaren verteilten System entwickeln lässt. Sie können eine hohe Abfrageleistung bei größeren Protokollierungsarbeitslasten durch Parallelisierung und Sharding von Abfragen erzielen – ein bisschen wie MapReduce für Ihre Protokolle.

Darüber hinaus steht diese Funktion jedem kostenlos zur Verfügung. Wie bei seiner offenen Observability-Plattform Grafana ist Grafana Labs bestrebt, Loki zu einer voll funktionsfähigen, vollständig offenen Protokollaggregationssoftware zu machen, die jeder verwenden kann.

Legen Sie los

Ich verwende Loki auf einem Raspberry Pi in meinem Heimnetzwerk und speichere meinen Shell-Verlauf extern in einem S3-Bucket.

Wenn ich STRG+R drücke, stellt die LogCLI-Befehlszeilenschnittstelle von Loki mehrere Stapelanforderungen, die in fzf gestreamt werden. Hier ist ein Beispiel – der obere Teil zeigt die Loki-Serverprotokolle auf dem Pi.

Bereit es auszuprobieren? Die folgende Anleitung hilft Ihnen beim Einrichten und Ausführen von Loki, um es in Ihren Shell-Verlauf zu integrieren. Da dieses Tutorial darauf abzielt, die Dinge einfach zu halten, führt dieses Setup Loki lokal auf Ihrem Computer aus und speichert alle Dateien im Dateisystem.

All dies sowie Informationen darüber, wie Sie eine aufwändigere Installation einrichten, finden Sie im GitHub-Repository von loki-shell.

Beachten Sie, dass dieses Tutorial keine bestehenden Verhaltensweisen in Ihrem Verlauf ändert, sodass Ihr bestehender Shell-Verlaufsbefehl und Ihre Verlaufseinstellungen unverändert bleiben. Stattdessen wird der Befehlsverlauf mit $PROMPT_COMMAND an Loki dupliziert in Bash und precmd in Zsch. Auf der STRG+R-Seite wird die Funktion überladen, die fzf verwendet, um auf den STRG+R-Befehl zuzugreifen. Das Ausprobieren ist ungefährlich, und wenn Sie entscheiden, dass es Ihnen nicht gefällt, folgen Sie einfach den Deinstallationsschritten im GitHub-Repo, um alle Spuren zu entfernen. Ihr Shell-Verlauf bleibt unberührt.

Schritt 1:fzf installieren

Es gibt mehrere Möglichkeiten, fzf zu installieren, aber ich bevorzuge die Git-Methode:

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

Sagen Sie Ja zu allen Frageaufforderungen.

Wenn Sie fzf bereits installiert haben, vergewissern Sie sich, dass die Tastenbelegung aktiviert ist (d. h. stellen Sie sicher, dass fzf erscheint, wenn Sie STRG+R eingeben). Sie können die fzf-Installation erneut ausführen, um bei Bedarf Tastenbelegungen zu aktivieren.

Schritt 2:Loki-shell installieren

Wie fzf hat auch loki-shell ein Git-Repo und ein Installationsskript:

git clone --depth 1 https://github.com/slim-bean/loki-shell.git ~/.loki-shell
~/.loki-shell/install

Zuerst erstellt das Skript die ~/.loki-shell Verzeichnis, in dem alle Dateien gespeichert werden (einschließlich Loki-Daten). Als nächstes werden Binärdateien für Promtail, LogCLI und Loki heruntergeladen.

Dann wird gefragt:

Do you want to install Loki? ([y]/n)

Wenn Sie bereits ein zentralisiertes Loki haben, das für loki-shell läuft, könnten Sie n antworten; Antworten Sie für dieses Tutorial jedoch mit y oder drücken Sie die Eingabetaste.

Es gibt zwei Möglichkeiten, Loki lokal auszuführen:als Docker-Image oder als einzelne Binärdatei (mit Unterstützung für das Hinzufügen eines systemd-Dienstes). Ich empfehle die Verwendung von Docker, wenn es verfügbar ist, da es meines Erachtens den Betrieb etwas vereinfacht, aber beide funktionieren einwandfrei.

Ausführen mit Docker

So führen Sie Loki als Docker-Image aus:

[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) y
Error: No such object: loki-shell
Error response from daemon: No such container: loki-shell
Error: No such container: loki-shell
54843ff3392f198f5cac51a6a5071036f67842bbc23452de8c3efa392c0c2e1e

Wenn Sie die Installation zum ersten Mal ausführen, können Sie die Fehlermeldungen ignorieren. Dieses Skript stoppt und ersetzt einen laufenden Loki-Container, wenn die Version nicht übereinstimmt, sodass Sie dieses Skript erneut ausführen können, um Loki zu aktualisieren.

Das ist es! Loki läuft jetzt als Docker-Container.

Daten von Loki werden in ~/.loki-shell/data gespeichert .

Das Image läuft mit --restart=unless-stopped , also wird es beim Neustart neu gestartet, bleibt aber gestoppt, wenn Sie docker stop loki-shell ausführen .

(Wenn Sie Docker verwenden, können Sie zur Shell-Integration springen.)

Als Binärdatei ausgeführt

Es gibt viele Möglichkeiten, eine Binärdatei auf einem Linux-System auszuführen. Dieses Skript kann einen systemd-Dienst installieren. Wenn Sie systemd nicht haben, können Sie trotzdem die binäre Installation verwenden:

[y] to run Loki in Docker, [n] to run Loki as a binary ([y]/n) n

Run Loki with systemd? ([y]/n) n

This is as far as this script can take you
You will need to setup an auto-start for Loki
It can be run with this command: /home/username/.loki-shell/bin/loki -config.file=/home/username/.loki-shell/config/loki-binary-config.yaml

Das Skript spuckt den Befehl aus, den Sie zum Ausführen von Loki benötigen, und Sie müssen selbst ein Init-Skript oder eine andere Methode zum automatischen Starten einrichten.

Sie können den Befehl direkt ausführen, wenn Sie möchten, und Loki von Ihrer aktuellen Shell ausführen.

Wenn Sie tun Wenn Sie systemd haben, haben Sie die Möglichkeit, das Skript den systemd-Dienst installieren zu lassen oder Ihnen die Befehle zu zeigen, um ihn selbst auszuführen:

Run Loki with systemd? ([y]/n) y

Installing the systemd service requires root permissions.
[y] to run these commands with sudo [n] to print out the commands and you can run them yourself. ([y]/n) n
sudo cp /home/ed/.loki-shell/config/loki-shell.service /etc/systemd/system/loki-shell.service
sudo systemctl daemon-reload
sudo systemctl enable loki-shell
sudo systemctl start loki-shell
Copy these commands and run them when the script finishes. (press enter to continue)

Shell-Integration

Unabhängig davon, wie Sie Loki installiert haben, sollten Sie jetzt eine Eingabeaufforderung sehen:

Enter the URL for your Loki server or press enter for default (http://localhost:4100)

Wenn Sie ein zentralisiertes Loki eingerichtet hätten, würden Sie diese URL hier eingeben. Diese Demo verwendet jedoch nur die Standardeinstellung, sodass Sie die Eingabetaste drücken können.

Es wird eine Menge Text ausgespuckt, der alle Einträge erklärt, die zu Ihrer ~.bashrc hinzugefügt wurden oder ~.zshrc (oder beides).

Das ist es!

Finished. Restart your shell or reload config file.
   source ~/.bashrc  # bash
   source ~/.zshrc   # zsh

Schritt 3:Probieren Sie es aus!

Beginnen Sie mit der Verwendung Ihrer Shell und verwenden Sie STRG+R, um Ihre Befehle anzuzeigen.

Öffnen Sie mehrere Terminalfenster, geben Sie in einem einen Befehl und in einem anderen STRG+R ein, und Ihre Befehle sind sofort verfügbar.

Beachten Sie außerdem, dass beim Wechseln zwischen Terminals und Eingeben von Befehlen diese sofort mit STRG+R verfügbar sind, die Funktion des Aufwärtspfeils zwischen Terminals jedoch nicht beeinträchtigt wird. (Dies trifft möglicherweise nicht zu, wenn Sie Oh My Zsh installiert haben, da es automatisch alle Befehle an den Verlauf anhängt.)

Verwenden Sie mehrmals STRG+R, um zwischen der Sortierung nach Zeit und nach Relevanz umzuschalten.

Beachten Sie, dass diese Konfiguration nur den Abfrageverlauf des aktuellen Hosts anzeigt, selbst wenn Sie Shell-Daten von mehreren Hosts an Loki senden. Ich denke, standardmäßig ist dies am sinnvollsten. Es gibt eine Menge, die Sie optimieren können, wenn Sie möchten, dass sich dieses Verhalten ändert. Weitere Informationen finden Sie im Loki-Shell-Repo.

Es installierte auch einen Alias ​​namens hist :

alias hist="$HOME/.loki-shell/bin/logcli --addr=$LOKI_URL"

LogCLI kann verwendet werden, um Ihren Verlauf direkt in Loki abzufragen und zu durchsuchen, einschließlich der Möglichkeit, andere Hosts zu durchsuchen. Sehen Sie sich den Leitfaden „Erste Schritte“ für LogCLI an, um mehr über Abfragen zu erfahren.

Die Protokollabfragesprache von Loki (LogQL) bietet metrische Abfragen, mit denen Sie einige interessante Dinge tun können. zum Beispiel kann ich sehen, wie oft ich den kc ausgegeben habe Befehl (mein Alias ​​für kubectl) in den letzten 30 Tagen:

Zusätzlicher Kredit

Installieren Sie Grafana und spielen Sie mit Ihrem Shell-Verlauf herum:

docker run -d -p 3000:3000 --name=grafana grafana/grafana

Öffnen Sie einen Webbrowser unter http://localhost:3000 und melden Sie sich mit dem standardmäßigen admin/admin an Benutzername und Passwort.

Navigieren Sie links zu Konfiguration -> Datenquellen , klicken Sie auf Datenquelle hinzufügen -Taste und wählen Sie Loki .

Als URL sollten Sie http://localhost:4100 verwenden können (Auf meinem WSL2-Rechner musste ich jedoch die tatsächliche IP-Adresse des Computers verwenden).

Klicken Sie auf Speichern und testen . Sie sollten Datenquelle verbunden und Labels gefunden sehen .

Klicken Sie auf Erkunden Symbol auf der linken Seite, stellen Sie sicher, dass Loki Datenquelle ausgewählt ist, und probieren Sie eine Abfrage aus:

{job="shell"}

Wenn mehrere Hosts Shell-Befehle senden, können Sie die Ergebnisse mit hostname auf einen bestimmten Host beschränken Bezeichnung:

{job="shell", hostname="myhost"}.

Sie können auch mit Filterausdrücken nach bestimmten Befehlen suchen:

{job="shell"} |= "docker"

Oder Sie können die Welt der Metriken aus Protokollen erkunden, um zu sehen, wie oft Sie Ihre Shell verwenden:

rate({job="shell"}[1m])

Möchten Sie einen Zeitstrahl von einem Vorfall rekonstruieren? Sie können nach einem bestimmten Befehl filtern und sehen, wann er ausgeführt wurde.

Um zu sehen, was Sie sonst noch tun können, und um mehr über die Abfragesprache von Loki zu erfahren, lesen Sie den LogQL-Leitfaden.

Abschließende Gedanken

Weitere Ideen, Fehlerbehebung und Updates finden Sie im GitHub-Repo. Dies ist noch in Arbeit, also melden Sie bitte alle Probleme dort.

Um mehr über Loki zu erfahren, sehen Sie sich die Dokumentation, Blogbeiträge und das GitHub-Repo an oder probieren Sie es in Grafana Cloud aus.


Ein besonderer Dank geht an meinen Kollegen Jack Baldry, der den Samen für diese Idee gelegt hat. Ich hatte das Loki-Wissen, um dies möglich zu machen, aber ohne seinen Vorschlag, glaube ich nicht, dass ich es hierher geschafft hätte.


Linux
  1. Kontrollieren Sie die Uhrzeit und das Datum Ihres Computers mit systemd

  2. Programmieren mit Bash:Syntax und Tools

  3. Endgeschwindigkeit:Sich schnell in Ihrer Hülle bewegen

  4. Zeichnen Sie Ihr Terminal mit Skript und Skriptwiederholung auf

  5. Einfärben Ihrer Terminal- und Shell-Umgebung?

So arbeiten Sie mit File and Shell Provisioner in Vagrant

Verlaufsbefehl mit Beispielen

Verwenden Sie Ihren Chromecast von Linux und MacOS mit mkchromecast

Bash-Anfängerserie Nr. 1:Erstellen Sie Ihr erstes Bash-Shell-Skript und führen Sie es aus

So finden Sie den Standort Ihrer Server mit Traceroute und WHOIS

Lesen und analysieren Sie Ihre Linux-Systemprotokolle mit Journalctl