2016-05-30 28 views
0

我有一個運行用戶代碼的應用程序。我想確保Docker不會收集太多的日誌,我將丟棄它。爲此,我試圖使用max-sizemax-file日誌記錄選項來獲取最後幾千字節的用戶輸出並丟棄其餘部分,但這似乎不起作用。限制碼頭日誌記錄

如果我做的:

$ 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 

然後,它仍然打印屏幕上的全輸出。如果我在主機上手動檢查日誌,我可以看到具有完整輸出的文件在那裏。

在這種情況下,我不應該只得到9\n嗎?我在這裏做錯了什麼?

+0

您正在使用的選項是用於最大文件大小和文件數。最大尺寸爲k/m/g。即使在設定之後,您將無法預測確切的線條數量。這是由文件大小 – Shibashis

回答

2

碼頭服務器JSON file log options不會影響輸入到您的docker客戶端的stdout和stderr。在前臺運行時您會看到完整的輸出。

當您運行docker logs時,信息將從文件中拉回。

最大尺寸需要一個單位。千字節,兆字節或千兆字節。

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

這設置了JSON日誌文件的大小,因此與僅貢獻大小的行長度相比,存在額外的元數據。

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

您應該將最多14個日誌條目放入1k空間。碼頭工人是否記錄旋轉是否準確是另一回事。

在任何情況下,您可能都在浪費時間處理小於4k的文件大小。

+0

我同意這個例子是有點人爲的(我們不打算只保留2個字節的輸出;-)。你說的似乎工作,除了它不是最後保存的N [k | m | g]個字節。日誌將被翻轉,最多** N [k | m | g]個字節將從用戶輸出中保存。即,它不是作爲具有FIFO的循環緩衝器來實現的。這可能會在文檔中更好地解釋。 –

+0

這是一個非常標準的UNIX文件日誌記錄設置。循環文件緩衝區很少見,因爲它不是由標準的linux文件系統提供的。內核在內存緩衝區中可以做得很小。您可能想嘗試[日誌記錄器](https://docs.docker.com/engine/admin/logging/journald/),因爲它可以登錄到環形緩衝區,而無需設置任何內容。 – Matt