logging - error - postgres docker logs




Wie leite ich Docker-Protokolle in eine einzelne Datei um? (6)

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 aber log in zwei verschiedenen dateien. Ich habe es schon versucht

docker logs container > /tmp/stdout.log

aber es hat nicht funktioniert.


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.

Daher müssen Sie in docker-compose 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 das Aktualisieren der fluentd conf, um die Protokolle für Service 1 und Service 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 bitten wir Sie, Protokolle in eine einzelne Datei zu diesem Pfad zu schreiben
/fluentd/log/service/service.*.log

und der dritte Schritt würde darin bestehen, das angepasste fluentd auszuführen, das beginnt, die Protokolle in die Datei zu schreiben.

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.


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

Führen Sie die folgenden Schritte aus, um sowohl stdout als auch stderr aus Ihrem Docker-Container in einer einzelnen Protokolldatei zu erfassen:

docker logs container > container.log 2>&1

Keine Notwendigkeit, Protokolle umzuleiten.

Docker speichert Protokolle standardmäßig 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 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 Es ist ähnlich wie wenn wir irgendwann den Befehl docker logs containername ausführen und nichts zurückgeben. In diesem Szenario ist diese Datei nicht verfügbar.


Wie wäre es mit dieser Option:

docker logs containername >& logs/myFile.log

Die in der Frage angeforderten Protokolle werden nicht umgeleitet, sondern nur einmal in eine bestimmte Datei kopiert.


docker logs -f <yourContainer> &> your.log &

Erläuterung:

  • -f (dh --follow ): schreibt alle vorhandenen Protokolle und protokolliert ( folgt ) alles, was als nächstes kommt.
  • &> leitet sowohl die Standardausgabe als auch den Standardfehler um.
  • Wahrscheinlich möchten Sie diese Methode im Hintergrund ausführen, daher das & .
  • Sie können Ausgabe und stderr wie > output.log 2> error.log trennen: > output.log 2> error.log (anstatt &> ).






docker