Protokolle müssen nicht umgeleitet werden.
Docker speichert standardmäßig Protokolle in einer Protokolldatei. So überprüfen Sie den Befehl zum Ausführen des Protokolldateipfads:
docker inspect --format='{{.LogPath}}' containername
/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
Öffnen Sie diese Protokolldatei und analysieren Sie sie.
Wenn Sie Protokolle umleiten, erhalten Sie Protokolle nur vor der Umleitung. Sie können keine Live-Protokolle sehen.
BEARBEITEN:
Um Live-Protokolle anzuzeigen, können Sie den folgenden Befehl ausführen
tail -f `docker inspect --format='{{.LogPath}}' containername`
Hinweis:
Diese Protokolldatei /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log
wird nur erstellt, wenn Docker Protokolle generiert, wenn keine Protokolle vorhanden sind. Diese Datei ist dann nicht vorhanden. Es ist ähnlich wie manchmal, wenn wir einen Befehl ausführen docker logs containername
und nichts zurückgibt. In diesem Szenario ist diese Datei nicht verfügbar.
tail -f `docker inspect --format='{{.LogPath}}' myapp`
- Es ist wirklich JSONWie wäre es mit dieser Option:
docker logs containername >& logs/myFile.log
Protokolle, nach denen in der Frage gefragt wurde, werden nicht umgeleitet, sondern einmal in eine bestimmte Datei kopiert.
quelle
docker logs --help
, um sicher zu seindocker logs -f <yourContainer> &> your.log &
Erläuterung:
-f
(dh--follow
): schreibt alle vorhandenen Protokolle und fährt fort ( folgt ) Protokollierung alles, was als nächstes kommt.&>
Leitet sowohl die Standardausgabe als auch den Standardfehler um.&
.> output.log 2> error.log
(anstatt zu verwenden&>
).quelle
Führen Sie Folgendes aus, um sowohl stdout als auch stderr aus Ihrem Docker-Container in einer einzelnen Protokolldatei zu erfassen:
quelle
Angenommen, Sie haben mehrere Container und möchten die Protokolle in einer einzigen Datei zusammenfassen, müssen Sie einen Protokollaggregator wie fluentd verwenden. fluentd wird als Protokollierungstreiber für Docker-Container unterstützt.
In Docker-Compose müssen Sie also den Protokollierungstreiber definieren
Der zweite Schritt wäre die Aktualisierung der fließenden Konfiguration, um die Protokolle sowohl für Dienst 1 als auch für Dienst 2 bereitzustellen
In dieser Konfiguration bitten wir Sie, Protokolle in eine einzelne Datei in diesen Pfad zu schreiben
/fluentd/log/service/service.*.log
und der dritte Schritt wäre, das angepasste Fluentd auszuführen, das mit dem Schreiben der Protokolle in die Datei beginnt.
Hier ist der Link für Schritt-für-Schritt-Anleitungen
Etwas lang, aber korrekt, da Sie mehr Kontrolle über den Pfad der Protokolldateien usw. haben und dies auch in Docker Swarm gut funktioniert.
quelle
Da Docker für uns stdout und stderr zusammenführt, können wir die Protokollausgabe wie jeden anderen Shell-Stream behandeln. Verwenden Sie einen Umleitungsoperator, um die aktuellen Protokolle in eine Datei umzuleiten
$ docker logs test_container > output.log
docker logs -f test_container > output.log
Anstatt die Ausgabe an stderr und stdout zu senden, leiten Sie die Ausgabe Ihrer Anwendung in eine Datei um und ordnen Sie die Datei einem permanenten Speicher außerhalb des Containers zu.
$ docker logs test_container> /tmp/output.log
Docker akzeptiert keine relativen Pfade in der Befehlszeile. Wenn Sie also ein anderes Verzeichnis verwenden möchten, müssen Sie den vollständigen Pfad verwenden.
quelle
Wenn Sie unter Windows arbeiten und PowerShell verwenden (wie ich), können Sie die folgende Zeile verwenden, um das
stdout
und zu erfassenstderr
:Ich hoffe es hilft jemandem!
quelle
foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
Der einfachste Weg, den ich benutze, ist dieser Befehl auf dem Terminal:
Struktur ist:
quelle
Überprüfen Sie zuerst Ihre Container-ID
Sie können die erste Zeile in den Spalten CONTAINER ID sehen. Wahrscheinlich sieht es so aus: "3fd0bfce2806", dann tippe es in die Shell
Sie werden so etwas sehen
dann können Sie es als sehen
Es wäre im JSON-Format, Sie können den Zeitstempel verwenden, um Fehler zu verfolgen
quelle
Bash-Skript zum Kopieren aller Containerprotokolle in ein angegebenes Verzeichnis:
quelle