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 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 :
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 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:
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)
containers
ist 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-logs
existiert 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 nsenter
können Sie Befehle in der xhyve
VM ausführen, die als Host für alle Docker-Container unter Docker4Mac fungiert. Der Befehl, den wir ausführen, ist der truncate -s0 $LOGPATH
aus 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.yml
Datei.
Vielen Dank an https://github.com/justincormack/nsenter1 für den nsenter
Trick.
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 run
wie 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 10m
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ü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 sh
eine sh-Shell in einen Container eingeben. Viele Container stellen den sudo
Befehl jedoch nicht implizit zur Verfügung.
sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"