2016-05-30 9 views
0

Ich habe eine Anwendung, die Benutzercode ausgeführt wird. Ich möchte sicherstellen, dass Docker nicht zu viele Logs sammelt, die ich sowieso verwerfe. Dazu versuche ich max-size und max-file Logging-Optionen zu verwenden, um nur die letzten paar Kilobyte der Benutzerausgabe zu erhalten und den Rest zu verwerfen, aber das scheint nicht zu funktionieren.Begrenzung docker Protokollierung

Wenn ich tun:

$ docker run --log-opt max-size=2 --log-opt max-file=1 python:2 python -c "for i in range(10): print i" 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

Dann druckt er immer noch die volle Leistung auf dem Bildschirm. Wenn ich die Protokolle manuell auf dem Host überprüfe, kann ich sehen, dass die Dateien mit der vollen Ausgabe vorhanden sind.

Sollte ich in diesem Fall nicht nur 9\n bekommen? Was mache ich hier falsch?

+0

Die von Ihnen verwendeten Optionen beziehen sich auf die maximale Dateigröße und die Anzahl der Dateien. Maximale Größe sud be k/m/g. Auch nach der Einstellung können Sie die genaue Anzahl der Zeilen nicht vorhersagen. Es ist von Dateigröße – Shibashis

Antwort

2

Dockers JSON file log options wirkt sich nicht auf den stdout- und stderr-Stream auf Ihren docker Client aus. Sie werden die vollständige Ausgabe sehen, wenn Sie im Vordergrund laufen.

Wenn Sie docker logs ausführen, werden Informationen aus der Datei abgerufen.

Die maximale Größe erfordert eine Einheit. Kilobyte, Megabyte oder Gigabyte.

--log-opt max-size=[0-9+][k|m|g] 

Dies stellt die Größe einer Datei JSON log so Metadaten nur die Zeilenlänge, die auf die Größe trägt verglichen es extra.

{"log":"1\n","stream":"stdout","time":"2016-05-30T07:39:31.265191929Z"} 

Sie sollten maximal 14 Protokolleinträge in 1k Speicherplatz einfügen. Ob die Log-Rotation der Hafenarbeiter so genau ist oder nicht, ist eine andere Sache.

Sie verschwenden wahrscheinlich Zeit mit Dateigrößen von weniger als 4k in jedem Fall.

+0

Ich stimme zu, das Beispiel ist ein bisschen erfunden (wir haben nicht vor, nur 2 Bytes der Ausgabe zu halten ;-). Was Sie sagen, scheint zu funktionieren, außer dass nicht die letzten N [k | m | g] Bytes gespeichert sind. Die Protokolle werden gerollt und ** höchstens ** N [k | m | g] Bytes werden von der Benutzerausgabe gespeichert. D.h., es ist nicht als ein Ringpuffer mit einem FIFO implementiert. Dies könnte in den Dokumenten etwas besser erklärt werden. –

+0

Das ist ein ziemlich Standard-Setup für die Dateiprotokollierung in Unix. Kreisförmige Dateipuffer wären selten, da sie nicht von Standard-Linux-Dateisystemen bereitgestellt werden. Der Kernel kann kleine Speicherpuffer verwenden. Vielleicht möchten Sie den [journald logger] (https://docs.docker.com/engine/admin/logging/journald/) ausprobieren, da dieser sich in einem Ringpuffer anmelden kann, ohne dass Sie etwas einrichten müssen. – Matt