it-swarm.com.de

wie kann man Docker-Protokolle in eine einzige Datei umleiten?

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.

54
KETAN PATIL

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.

67
pl_rock

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.

80
Eddy Hernandez

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.
  • Wahrscheinlich möchten Sie diese Methode im Hintergrund ausführen, also den &.
  • Sie können Ausgabe und Stderr folgendermaßen trennen: > output.log 2> error.log (anstelle von &>).
11
juanmirocks

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.

4
Abhishek Galoda

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
2
Jean Velloen

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!

1
mirind4

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
0
Mugen

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.

0
Anish Varghese