Was ist der beste Weg, um eine bestimmte Zeichenfolge in den Protokollen eines Docker-Containers zu finden? Angenommen, ich möchte alle Anfragen sehen, die im Docker-Image "nginx" gestellt werden, das von einer IP stammt, die mit "127" beginnt.
grep funktioniert nicht wie erwartet mit dem Docker-Protokollbefehl:
docker logs nginx | grep "127."
Es druckt alle Protokolle, filtert aber nicht das Ergebnis!
docker logs
die Ausgabe an die Standardausgabe? Denn wenn ja,grep
sollte es gut funktionieren. Wenn nicht, ist es etwas kaputt und Sie müssen den Standardfehler auf die Standardausgabe umleiten, bevor Sie mit filterngrep
.$ docker run -d --name foo busybox ls abcd $ docker logs foo > stdout.log 2>stderr.log $ cat stdout.log $ cat stderr.log ls: abcd: No such file or directory
docker logs
es schwer zu verstehen, da es Terminalsteuerungszeichen enthält. Ich würde die Nginx-Protokolldateien durchsuchen.Antworten:
Dies kann passieren, wenn sich der Container bei stderr anmeldet. Piping funktioniert nur für stdout. Versuchen Sie also:
quelle
Als Vim-Fan benutze
less
und suche ich lieber mit/
quelle
Um den Kommentaren nachzugehen und dies für alle anderen zu klären, die dieses Problem haben. Hier ist die einfachste Möglichkeit, ein Nginx-Containerprotokoll zu durchsuchen.
IMO ist etwas chaotisch, weil Sie diese möglicherweise sehr großen Dateien erstellen und löschen müssen. Hoffentlich bekommen wir ein paar Werkzeuge, um es ein bisschen bequemer zu machen.
quelle
docker logs
es separate stdout und stderr unterstützen github.com/moby/moby/issues/25683quelle
Außerdem fand ich es nützlich, einige Begriffe hervorzuheben, nach denen ich in den Protokollen suche. Besonders bei produktiven Installationen, bei denen viel Protokollausgabe generiert wird. In meinem Fall möchte ich
COUNT(*)
Aussagen hervorheben . Aber mit einem einfachen grep kann ich nicht die gesamte SQL-Anweisung sehen, da es sich um eine mehrzeilige Anweisung handelt. Dies ist mit-E
switch und etwas Regex möglich :Zum Beispiel Schnipsel folgende für alle Fragen suchen , die enthalten
COUNT(*)
sowiecount(*)
:Einige Erklärungen:
docker logs -f
sagen Docker zu f ollow die Protokolle, so auch die Filter applys neue Einträge wie beim Betrachten sie mittail -f
--line-buffered
schalten spült die Ausgabe auf jeder Zeile, die in Echtzeit erforderlich ist , wenn grepdocker logs -f
verwendet wird-E
eine ist e Xtended RegexMuster, benötigt unser Muster anzuwenden , die uns auch die nicht passenden Ergebnisse erlauben Rückkehr--color
hebt die übereinstimmenden Teile hervor (scheint das Standardverhalten auf meinem Ubuntu 16.04 LTS zu sein, aber möglicherweise nicht auf anderen Distributionen, daher habe ich es aus Sicherheitsgründen hier aufgenommen)*
entkam seine abzuschalten spezielle glob Funktionalität , wo(
und)
maskiert ihre regex zu vermeiden , als Gruppe bedeutet, die durch aktiviert-E
SchalterWenn sich der Container bei stderr anmeldet, können Sie sie weiterleiten, wie Edoardo bereits für einen einfachen grep geschrieben hat :
Der
-f
Schalter kann weggelassen werden, wenn kein Live-Grep gewünscht wird. In beiden Fällen wird das gesamte Protokoll mit einem hervorgehobenen Suchbegriff wie folgt angezeigt:quelle
Führen Sie den folgenden Befehl aus, um den Containernamen für das Image nginx zu extrahieren.
Kopieren Sie die Container-ID vom letzten Befehl und extrahieren Sie den Protokollpfad für Ihren Container über den folgenden Befehl
quelle
Verwenden Sie zuerst diesen Befehl (b1e3c456f07f ist die Container-ID):
Das Ergebnis wird ungefähr so aussehen:
Verwenden Sie zweitens diesen Befehl (Sie können vim verwenden, wenn Sie möchten):
quelle
Ich benutze es im Allgemeinen auch mit
-f
Option, wenn ich das Problem debuggedocker logs -f nginx 2>&1 | grep "127."
Es wird uns in Echtzeit zeigen, was wir erwarten.
quelle