Ich benutze docker logs [container-name]
, um die Protokolle eines bestimmten Containers zu sehen.
Gibt es eine elegante Möglichkeit, diese Protokolle zu löschen?
docker
docker-compose
boot2docker
docker-machine
Youssouf Maiga
quelle
quelle
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
Antworten:
Aus dieser Frage ergibt sich ein Einzeiler, den Sie ausführen können:
oder es gibt den ähnlichen Befehl zum Abschneiden:
Ich bin kein großer Fan von beidem, da sie Dockers Dateien direkt ändern. Das Löschen externer Protokolle kann auftreten, während Docker JSON-formatierte Daten in die Datei schreibt, was zu einer Teilzeile führt und die Fähigkeit zum Lesen von Protokollen aus der
docker logs
CLI beeinträchtigt .Stattdessen kann Docker die Protokolle automatisch für Sie drehen lassen. Dies erfolgt mit zusätzlichen Flags für dockerd, wenn Sie den Standard- JSON-Protokollierungstreiber verwenden :
Sie können dies auch als Teil Ihrer daemon.json- Datei festlegen , anstatt Ihre Startskripte zu ändern :
Diese Optionen müssen mit Root-Zugriff konfiguriert werden. Stellen Sie sicher, dass Sie a ausführen,
systemctl reload docker
nachdem Sie diese Datei geändert haben, damit die Einstellungen angewendet werden. Diese Einstellung ist dann die Standardeinstellung für alle neu erstellten Container. Beachten Sie, dass vorhandene Container gelöscht und neu erstellt werden müssen, um die neuen Protokolllimits zu erhalten.Ähnliche Protokolloptionen können an einzelne Container übergeben werden, um diese Standardeinstellungen zu überschreiben. Auf diese Weise können Sie mehr oder weniger Protokolle für einzelne Container speichern. So
docker run
sieht es aus:oder in einer Erstellungsdatei:
Für zusätzliche Platzersparnis können Sie vom json-Protokolltreiber zum "lokalen" Protokolltreiber wechseln. Es werden die gleichen Optionen für maximale Größe und maximale Datei verwendet, aber anstatt in json zu speichern, wird eine binäre Syntax verwendet, die schneller und kleiner ist. Auf diese Weise können Sie mehr Protokolle in einer Datei gleicher Größe speichern. Der Eintrag daemon.json dafür sieht folgendermaßen aus:
Der Nachteil des lokalen Treibers ist, dass externe Protokollparser / -weiterleitungen, die vom direkten Zugriff auf die JSON-Protokolle abhängig sind, nicht mehr funktionieren. Wenn Sie also ein Tool wie Filebeat zum Senden an Elastic oder Splunks Universal Forwarder verwenden, würde ich den "lokalen" Treiber vermeiden.
Ich habe in meiner Präsentation mit Tipps und Tricks etwas mehr dazu .
quelle
service docker restart
die alleine nicht funktioniert hat. Außerdem mussten brandneue Container erstellt werden, bevor sie in Kraft traten. Das heißt, nur die alten Containerecho -n > ...
. Auf jeden Fall möchte ich mehr Kontrolle über meine Protokolle haben. Zum Beispiel würde ich nach dem Neustart von Docker-Compose gerne den Mechanismus haben, um etwas mit den erhaltenen Protokollen zu tun.Verwenden:
Möglicherweise benötigen Sie Sudo
ref. Jeff S. Wie lösche ich die Protokolle für einen Docker-Container richtig?
Referenz: Abschneiden einer Datei während der Verwendung (Linux)
quelle
containers
ist sonst nicht verfügbar.sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
- arbeitete für micherror from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
Unter Docker für Windows und Mac und wahrscheinlich auch unter anderen ist es möglich, die Option tail zu verwenden. Beispielsweise:
Auf diese Weise werden nur die letzten 100 Zeilen angezeigt, und Sie müssen nicht zuerst durch 1 Million Zeilen scrollen ...
(Daher ist das Löschen des Protokolls wahrscheinlich nicht erforderlich.)
quelle
quelle
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
, um nur die Gesamtgröße der Protokolle zu erhaltensudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
Sie können logrotate einrichten, um die Protokolle regelmäßig zu löschen.
Beispieldatei in /etc/logrotate.d/docker-logs
quelle
docker run
? Datei/etc/logrotate.d/docker-logs
existiert nicht, ich muss es erstellen?"log-opts"
wie von BMitch gezeigt)Docker4Mac, eine Lösung für 2018:
In der ersten Zeile wird der Pfad der Protokolldatei angezeigt, ähnlich der akzeptierten Antwort.
In der zweiten Zeile
nsenter
können Sie Befehle in derxhyve
VM ausführen, die als Host für alle Docker-Container unter Docker4Mac fungiert. Der Befehl, den wir ausführen, ist dertruncate -s0 $LOGPATH
aus Nicht-Mac-Antworten bekannte.Wenn Sie verwenden
docker-compose
, wird die erste Zeile:und
<service>
ist der Dienstname aus Ihrerdocker-compose.yml
Datei.Vielen Dank an https://github.com/justincormack/nsenter1 für den
nsenter
Trick.quelle
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
Sie können dies nicht direkt über einen Docker-Befehl tun.
Sie können entweder die Größe des Protokolls begrenzen oder mithilfe eines Skripts Protokolle löschen, die sich auf einen Container beziehen. Beispiele für Skripte finden Sie hier (von unten lesen): Funktion: Möglichkeit zum Löschen des Protokollverlaufs # 1083
Lesen Sie den Protokollierungsabschnitt der Docker-Compose-Dateireferenz, in dem Sie Optionen (z. B. Protokollrotation und Protokollgrößenbeschränkung) für einige Protokollierungstreiber angeben können.
quelle
Versuchen Sie als Root- Benutzer Folgendes auszuführen:
oder
oder
quelle
Auf meinen Ubuntu-Servern würde ich sogar als Sudo bekommen
Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
Aber das Kämmen des Dockers inspizierte und schnitt die Antworten ab:
quelle
Ich bevorzuge dieses (aus den obigen Lösungen):
Ich verwende jedoch mehrere Systeme (z. B. Ubuntu 18.x Bionic), auf denen dieser Pfad nicht wie erwartet funktioniert. Docker wird über Snap installiert, sodass der Pfad zu Containern eher wie folgt lautet:
quelle
Sie können die Log-Opts-Parameter auch
docker run
wie folgt in der Befehlszeile angeben :oder in einer docker-compose.yml wie dieser
Credits: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
quelle
"5"
und"10m"
jeweils), wie gezeigt , hier für die globale daemon.json Datei, aber es ist das gleiche für ein Docker-compose.yml. In beiden Fällen sind nur neu erstellte Container betroffen."5"
es funktioniert. Die10m
Arbeit ohne zu zitieren.Docker für Mac-Benutzer, hier ist die Lösung:
Suchen Sie den Pfad der Protokolldatei nach:
$ docker inspect | grep log
SSH in den Docker-Computer (nehmen wir an, der Name lautet
default
, falls nicht, wird ausgeführtdocker-machine ls
, um dies herauszufinden):$ docker-machine ssh default
Wechsel zum Root-Benutzer ( Referenz ):
$ sudo -i
Löschen Sie den Inhalt der Protokolldatei:
$ echo "" > log_file_path_from_step1
quelle
docker exec -it default sh
eine sh-Shell in einen Container eingeben. Viele Container stellen densudo
Befehl jedoch nicht implizit zur Verfügung.