?
This document uses PHP Chinese website manual Release
本文檔介紹了Docker的日志驅(qū)動程序插件。
記錄驅(qū)動程序使用戶能夠?qū)⑷萜魅罩巨D(zhuǎn)發(fā)到其他服務(wù)進(jìn)行處理。Docker包含幾個(gè)日志驅(qū)動程序作為內(nèi)置函數(shù),但不能希望通過內(nèi)置驅(qū)動程序支持所有的使用情況。插件允許Docker支持廣泛的日志記錄服務(wù),而無需在主要Docker代碼庫中為這些服務(wù)嵌入客戶端庫。有關(guān)更多信息,請參閱插件文檔。
日志插件的主界面使用與其他插件類型使用的相同的JSON + HTTP RPC協(xié)議。請參閱示例插件以獲取日志插件的參考實(shí)現(xiàn)。這個(gè)例子包裝了內(nèi)置的jsonfilelog
日志驅(qū)動程序。
記錄插件必須在插件激活期間注冊為LogDriver
。一旦激活的用戶可以指定插件作為日志驅(qū)動程序。
有兩個(gè)日志插件必須實(shí)現(xiàn)的HTTP端點(diǎn):
/LogDriver.StartLogging
向插件發(fā)信號通知容器正在啟動,插件應(yīng)該開始接收日志。
日志將通過請求中定義的文件進(jìn)行流式傳輸。在Linux上,這個(gè)文件是一個(gè)FIFO。Windows上目前不支持日志記錄插件。
請求*
{"File": "/path/to/file/stream","Info": {"ContainerID": "123456"}}
File
是需要使用的日志流的路徑。每次調(diào)用都StartLogging
應(yīng)該提供不同的文件路徑,即使它是插件已經(jīng)收到日志的容器。該文件由docker用隨機(jī)生成的名稱創(chuàng)建。
Info
是有關(guān)正在記錄的容器的詳細(xì)信息。這是相當(dāng)自由的形式,但是由以下結(jié)構(gòu)定義來定義:
type Info struct { Config map[string]string ContainerID string ContainerName string ContainerEntrypoint string ContainerArgs []string ContainerImageID string ContainerImageName string ContainerCreated time.Time ContainerEnv []string ContainerLabels map[string]string LogPath string DaemonName string}
ContainerID
將始終提供此結(jié)構(gòu),但其他字段可能為空或缺失。
響應(yīng)
{"Err": ""}
如果在此請求期間發(fā)生錯(cuò)誤,請將錯(cuò)誤消息添加到Err
響應(yīng)中的字段。如果沒有錯(cuò)誤,那么你可以發(fā)送一個(gè)空的響應(yīng)({}
)或一個(gè)空的值的Err
字段。
此時(shí)驅(qū)動程序應(yīng)該使用傳入文件中的日志消息。如果消息未被使用,它可能會導(dǎo)致容器在嘗試寫入其stdio流時(shí)被阻塞。
日志流消息被編碼為協(xié)議緩沖區(qū)。protobuf定義在docker倉庫中。
由于協(xié)議緩沖區(qū)不是自分隔的,所以必須使用以下流格式從流中解碼它們:
[size][message]
在哪里size
是一個(gè)4字節(jié)的大端二進(jìn)制編碼uint32。size
在這種情況下定義下一個(gè)消息的大小。message
是實(shí)際的日志條目。
流編碼器/解碼器的參考golang實(shí)現(xiàn)可以在這里找到
/LogDriver.StopLogging
指示插件停止從定義的文件中收集日志。一旦收到響應(yīng),該文件將被Docker刪除。在回應(yīng)此請求之前,您必須確保收集流上的所有日志,否則可能會丟失日志數(shù)據(jù)。
此端點(diǎn)上的請求并不意味著該容器僅在已停止的情況下被移除。
請求:
{"File": "/path/to/file/stream"}
響應(yīng):
{"Err": ""}
如果在此請求期間發(fā)生錯(cuò)誤,請將錯(cuò)誤消息添加到Err
響應(yīng)中的字段。如果沒有錯(cuò)誤,那么你可以發(fā)送一個(gè)空的響應(yīng)({}
)或一個(gè)空的值的Err
字段。
日志記錄插件可以實(shí)現(xiàn)兩個(gè)額外的日志記錄端點(diǎn):
/LogDriver.Capabilities
定義日志驅(qū)動程序的功能。您必須為Docker實(shí)現(xiàn)此端點(diǎn)才能利用任何已定義的功能。
請求:
{}
響應(yīng):
{"ReadLogs": true}
支助能力:
ReadLogs
- 這告訴Docker該插件能夠?qū)⑷罩咀x回客戶端。報(bào)告他們支持的插件ReadLogs
必須實(shí)現(xiàn)/LogDriver.ReadLogs
端點(diǎn)/LogDriver.ReadLogs
將日志讀回客戶端。這在docker logs <container>
被調(diào)用時(shí)使用。為了讓Docker使用這個(gè)端點(diǎn),插件必須在/LogDriver.Capabilities
被調(diào)用時(shí)指定多少。
請求:
"ReadConfig": {}, "Info": { "ContainerID": "123456" } }
ReadConfig
是閱讀選項(xiàng)列表,它定義了一個(gè)具有以下golang結(jié)構(gòu):類型ReadConfig結(jié)構(gòu){由于尾了time.time int跟隨bool}
Since
定義應(yīng)該發(fā)送的最舊日志。
Tail
定義要讀取的行數(shù)(例如,像命令tail -n 10
)
Follow
表示客戶希望保持連接狀態(tài),以便在讀取現(xiàn)有日志后收到新的日志消息。
Info
是在中定義的相同類型/LogDriver.StartLogging
。它應(yīng)該用于確定要讀取的日志集合。
響應(yīng):
響應(yīng)應(yīng)該是編碼的日志消息,使用與插件從Docker消耗的消息相同的格式。