Ich möchte alle Protokolle meines Docker-Containers in eine einzelne Protokolldatei umleiten, um sie zu analysieren. Ich habe es versucht
docker logs container > /tmp/stdout.log 2>/tmp/stderr.log
dies gibt jedoch zwei unterschiedliche Dateien an. Ich habe es schon versucht
docker logs container > /tmp/stdout.log
aber es hat nicht funktioniert.
Keine Notwendigkeit, Protokolle umzuleiten.
Docker speichern standardmäßig Protokolle in einer Protokolldatei. So prü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 nur Protokolle 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 das Andockfenster Protokolle generiert, wenn keine Protokolle vorhanden sind. Diese Datei ist dann nicht vorhanden. Es ist ähnlich wie wenn wir den Befehl docker logs containername
ausführen und nichts zurückgibt. In diesem Szenario ist diese Datei nicht verfügbar.
Wie wäre es mit dieser Option:
docker logs containername >& logs/myFile.log
Protokolle, die in der Frage angefordert wurden, werden nicht umgeleitet, sondern nur einmal in eine bestimmte Datei kopiert.
docker logs -f <yourContainer> &> your.log &
Erläuterung:
-f
(d. h .--follow
): Schreibt alle vorhandenen Protokolle und protokolliert alles, was als nächstes kommt (folgt).&>
leitet sowohl die Standardausgabe als auch den Standardfehler um.&
.> output.log 2> error.log
(anstelle von &>
).Wenn Sie davon ausgehen, dass Sie über mehrere Container verfügen und die Protokolle in einer einzigen Datei zusammenfassen möchten, müssen Sie einen Protokollaggregator wie fluentd verwenden. fluentd wird als Protokolltreiber für Docker-Container unterstützt.
In Docker-Compose müssen Sie also den Protokollierungstreiber definieren
service1:
image: webapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service1
service2:
image: myapp:0.0.1
logging:
driver: "fluentd"
options:
tag: service2
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
<match service1>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%z
</store>
</match>
<match service2>
@type copy
<store>
@type file
path /fluentd/log/service/service.*.log
time_slice_format %Y%m%d
time_slice_wait 10m
time_format %Y%m%dT%H%M%S%
</store>
</match>
In dieser Konfiguration möchten wir, dass Protokolle in eine einzige Datei in diesem Pfad geschrieben werden/fluentd/log/service/service.*.log
der dritte Schritt besteht darin, den benutzerdefinierten Fluss auszuführen, der die Protokolle in die Datei schreibt.
Hier ist der Link für Schritt für Schritt Anweisungen
Etwas lang, aber korrekt, da Sie mehr Kontrolle über den Pfad der Protokolldateien usw. erhalten, und es funktioniert auch in Docker Swarm.
Führen Sie die folgenden Schritte aus, um stdout und stderr aus Ihrem Docker-Container in einer einzigen Protokolldatei zu erfassen
docker logs container > container.log 2>&1
Wenn Sie unter Windows arbeiten und PowerShell (wie ich) verwenden, können Sie in der folgenden Zeile stdout
und stderr
erfassen:
docker logs <containerId> | Out-File 'C:/dev/mylog.txt'
Ich hoffe es hilft jemandem!
Bash-Skript zum Kopieren aller Containerprotokolle in ein angegebenes Verzeichnis:
#!/usr/bin/env bash
TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in `Sudo docker ps --format '{{.Names}}'`;
do
path=$(Sudo docker inspect --format='{{.LogPath}}' $name)
Sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done
Da Docker stdout und stderr für uns 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 der 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.