Ich verwende docker logs [container-name]
, um die Protokolle eines bestimmten Containers anzuzeigen.
Gibt es eine elegante Möglichkeit, diese Protokolle zu löschen?
Aus dieser Frage gibt es einen Einzeiler, den Sie ausführen können:
echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
Ich bin kein großer Fan davon, Docker-Dateien direkt mit diesem Befehl, einem Kürzungsbefehl oder einer Protokolldrehung zu ändern, da sich beide außerhalb von Docker befinden. Das Löschen von externen Protokollen kann passieren, während Docker mit JSON formatierte Daten in die Datei schreibt, was zu einer Teilzeile führt und die Fähigkeit zum Lesen von Protokollen aus dem docker logs
-Cli beeinträchtigt.
Stattdessen kann Docker die Protokolle automatisch für Sie drehen. Dies geschieht mit zusätzlichen Flags für dockerd, wenn Sie den Standard-JSON-Protokolliertreiber verwenden :
dockerd ... --log-opt max-size=10m --log-opt max-file=3
Sie können dies auch als Teil Ihrer Datei daemon.json festlegen, anstatt Ihre Startskripte zu ändern:
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
Stellen Sie sicher, dass Sie systemctl reload docker
ausführen, nachdem Sie diese Datei geändert haben, damit die Einstellungen übernommen werden. Diese Einstellung ist dann die Standardeinstellung für alle neu erstellten Container. Vorhandene Container müssen gelöscht und neu erstellt werden, um die neuen Protokollgrenzwerte zu erhalten. Ähnliche Protokolloptionen können an einzelne Container übergeben werden, um diese Standardeinstellungen zu überschreiben, sodass Sie mehr oder weniger Protokolle für einzelne Container speichern können.
Verwenden:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
Sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"
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
}
Sie können dies nicht direkt über einen Docker-Befehl ausführen.
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 gelesen): Feature: Möglichkeit zum Löschen des Protokollverlaufs # 108
Lesen Sie den Abschnitt Protokollierung in der Docker-Compose-Dateireferenz, in der Sie Optionen (z. B. Protokollrotation und Protokollgrößenbeschränkung) für einige Protokolltreiber angeben können.
Unter Docker unter Windows und wahrscheinlich auch unter anderen ist es möglich, die Option tail zu verwenden.
z.B. Docker-Protokolle -f --tail 100 msftmodbus
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.)
Docker4Mac, eine 2018 Lösung:
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 wie bei der akzeptierten Antwort.
In der zweiten Zeile wird nsenter
verwendet, mit dem Sie Befehle auf dem xhyve
VM ausführen können, der als Host für alle Docker-Container unter Docker4Mac fungiert. Der Befehl, den wir ausführen, ist der vertraute truncate -s0 $LOGPATH
von Nicht-Mac-Antworten.
Wenn Sie docker-compose
verwenden, wird die erste Zeile zu:
local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))
und <service>
ist der Servicename aus Ihrer docker-compose.yml
-Datei.
Vielen Dank an https://github.com/justincormack/nsenter1 für den Trick nsenter
.
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 Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory
bekommen
Das Kämmen des Dockers zum Überprüfen und Abschneiden von Antworten hat jedoch funktioniert:
Sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`
Docker für Mac-Benutzer, hier ist die Lösung:
Suchen des Protokolldateipfads nach:
$ docker inspect | grep log
SSH in den Docker einbinden (Angenommen, der Name ist default
, andernfalls docker-machine ls
ausführen, um dies herauszufinden):
$ docker-machine ssh default
Wechseln Sie zu root ( Referenz ):
$ Sudo -i
Löschen Sie den Inhalt der Protokolldatei:
$ echo "" > log_file_path_from_step1