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?
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?
Antworten:
Aus dieser Frage ergibt sich ein Einzeiler, den Sie ausführen können:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
oder es gibt den ähnlichen Befehl zum Abschneiden:
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
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 logsCLI 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 :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Sie können dies auch als Teil Ihrer daemon.json- Datei festlegen , anstatt Ihre Startskripte zu ändern :
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Diese Optionen müssen mit Root-Zugriff konfiguriert werden. Stellen Sie sicher, dass Sie a ausführen, systemctl reload dockernachdem 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 runsieht es aus:
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...
oder in einer Erstellungsdatei:
version: '3.7'
services:
app:
image: ...
logging:
options:
max-size: "10m"
max-file: "3"
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:
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
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 .
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 Container
echo -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:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Möglicherweise benötigen Sie Sudo
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
ref. Jeff S. Wie lösche ich die Protokolle für einen Docker-Container richtig?
Referenz: Abschneiden einer Datei während der Verwendung (Linux)
containersist sonst nicht verfügbar.
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"- arbeitete für mich
error 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:
docker logs -f --tail 100
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.)
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
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
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
size=50M
missingok
delaycompress
copytruncate
}
docker run? Datei /etc/logrotate.d/docker-logsexistiert nicht, ich muss es erstellen?
"log-opts"wie von BMitch gezeigt)
Docker4Mac, eine Lösung für 2018:
LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH
In der ersten Zeile wird der Pfad der Protokolldatei angezeigt, ähnlich der akzeptierten Antwort.
In der zweiten Zeile nsenterkönnen Sie Befehle in der xhyveVM ausführen, die als Host für alle Docker-Container unter Docker4Mac fungiert. Der Befehl, den wir ausführen, ist der truncate -s0 $LOGPATHaus Nicht-Mac-Antworten bekannte.
Wenn Sie verwenden docker-compose, wird die erste Zeile:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
und <service>ist der Dienstname aus Ihrer docker-compose.ymlDatei.
Vielen Dank an https://github.com/justincormack/nsenter1 für den nsenterTrick.
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.
Versuchen Sie als Root- Benutzer Folgendes auszuführen:
> /var/lib/docker/containers/*/*-json.log
oder
cat /dev/null > /var/lib/docker/containers/*/*-json.log
oder
echo "" > /var/lib/docker/containers/*/*-json.log
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:
sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
Ich bevorzuge dieses (aus den obigen Lösungen):
truncate -s 0 /var/lib/docker/containers/*/*-json.log
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:
truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log
Sie können die Log-Opts-Parameter auch docker runwie folgt in der Befehlszeile angeben :
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
oder in einer docker-compose.yml wie dieser
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-file: "5"
max-size: 10m
Credits: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (James Quigley)
"5"es funktioniert. Die 10mArbeit 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ührt docker-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
docker exec -it default sheine sh-Shell in einen Container eingeben. Viele Container stellen den sudoBefehl jedoch nicht implizit zur Verfügung.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"