RFC-5424 ==== ###### tags: `RFC` `syslog` `note` [RFC-5424](https://datatracker.ietf.org/doc/html/rfc5424) RFC 5424 是 "The Syslog Protocol"(Syslog 協議)的標準定義,由網際網路工程任務組 (IETF) 於 2009 年發布。這個協議定義了一種消息格式和傳輸機制,讓各種不同的設備、應用程序和平台能夠將日誌訊息統一傳輸至中央收集器或者日誌分析平台。 RFC 5424 是 RFC 3164 的更新,優化了許多方面,包括: 更加詳細和結構化的消息格式,包括時間戳、主機名、應用程序名、進程 ID、消息 ID 和結構化數據等元素。 支持更多的字符集,不僅限於 ASCII。 引入了消息的嚴重程度(severity)和設施(facility)碼,這兩種碼都是用於將消息分類。 Syslog 協議主要用於網絡設備和系統軟件的日誌消息傳輸,它可以用於診斷問題、分析和預防問題,以及安全監控和符合性報告等。 --- 在 RFC 5424 的 Syslog 協議中,的確有提到類似於 "eventSource" 和 "eventID" 的概念。這兩者分別由 "APP-NAME" 和 "MSGID" 兩個欄位來表示,主要被用來標識和分類日誌訊息的源頭和類型。 [<B>APP-NAME</B>](https://datatracker.ietf.org/doc/html/rfc5424#section-6.2.5):這是用來標識發送 Syslog 訊息的應用程式或者進程的名稱,你可以將它視作 "eventSource"。這個欄位有助於確定哪個程式或者進程產生了該訊息。 [<B>MSGID</B>](https://datatracker.ietf.org/doc/html/rfc5424#section-6.2.7): 這是訊息的識別碼,通常用於標識同一類型的事件。這個識別碼通常由 APP-NAME 生成並維護,你可以將它視作 "eventID"。不過,這不是一個唯一識別碼,因為多條相同類型的訊息可能具有相同的 MSGID。 > MSGID 被定義為識別訊息的標籤,這個標籤對於相同類型的訊息是相同的。然而,這個標籤的具體形式並沒有嚴格規定,它可能由數字、字母或其他字符組成,具體取決於應用程序或設備的設計和需求。 > 舉例來說,假設我們有一個 Web 伺服器,它在接收到 HTTP 請求時會發送一條訊息,並在回應完成後發送另一條訊息。這兩種訊息可能被分別賦予 MSGID "REQ_RECEIVED" 和 "RESP_SENT"。這樣,我們就可以根據 MSGID 知道每條訊息對應的是哪一種事件。 請注意,RFC 5424 提供的是一個[<B>結構化</B>](https://datatracker.ietf.org/doc/html/rfc5424#section-6.3)的日誌訊息格式,可以方便地被人類或者機器讀取和解析。然而,這種格式是否被遵守,以及如何具體實現,則取決於具體的應用程式或者設備。 syslog格式如下 ```arduino= <PRI>TIMESTAMP HOSTNAME APP-NAME PROCID MSGID MSG ``` 其中: PRI 是一個包含設施(facility)和嚴重程度(severity)的數字。嚴重程度也可以被視為 log level。例如,"Error" 可能對應於數字 3,"Warning" 可能對應於數字 4。 [RPI-Facility與Severity列舉](https://datatracker.ietf.org/doc/html/rfc5424#section-6.2.1) ```arduino= PRI = Facility * 8 + Severity ``` 這個公式中,Facility 的值範圍是 0 到 23,Severity 的值範圍是 0 到 7。對於 local use(在此假設為 local5),其 Facility 的值應為 21(根據 RFC 5424)。所以,如果我們想要的 severity 值分別為 5 ("Notice"), 6 ("Informational") 和 7 ("Debug"),那麼我們應該計算出相應的 PRI 值: ```arduino= PRI for "Notice" = 21 * 8 + 5 = 173 PRI for "Informational" = 21 * 8 + 6 = 174 PRI for "Debug" = 21 * 8 + 7 = 175 ``` TIMESTAMP 是訊息產生的時間,格式為 "YYYY-MM-DDTHH:MM:SS.sssZ"。 HOSTNAME 是產生訊息的機器名稱。 APP-NAME 是產生訊息的應用程式或進程名稱,可以視為 event source。 PROCID 是產生訊息的進程的 ID。 MSGID 是消息類型的識別碼。 MSG 是實際的訊息內容。 ### Examples: * Web 伺服器處理 HTTP 請求的訊息: ```arduino= <34>1 2023-06-05T15:00:00.000Z mywebserver.com mywebapp 1234 HTTP_REQUEST - Request received: GET /index.html ``` * Web 伺服器生成 404 錯誤頁面的訊息: ```arduino= <34>1 2023-06-05T15:00:05.000Z mywebserver.com mywebapp 1234 ERROR_404 - Error page generated for request: GET /nonexistent.html ``` 在這個訊息中,MSGID 是 "ERROR_404",訊息內容是 "Error page generated for request: GET /nonexistent.html"。 * 資料庫系統執行查詢的訊息: ```arduino= <27>1 2023-06-05T15:00:10.000Z mydbserver.com mydb 5678 QUERY_EXECUTE - Query executed: SELECT * FROM users ``` 在這個訊息中,"mydb" 是 APP-NAME,"5678" 是 PROCID,"QUERY_EXECUTE" 是 MSGID,訊息內容是 "Query executed: SELECT * FROM users"。 * 資料庫系統關閉連接的訊息: ```arduino= <27>1 2023-06-05T15:00:15.000Z mydbserver.com mydb 5678 CONNECTION_CLOSE - Connection closed: client 192.0.2.1 ``` 在這個訊息中,MSGID 是 "CONNECTION_CLOSE",訊息內容是 "Connection closed: client 192.0.2.1"。 * 自己寫的application 舉例來說,你的應用程式可能會生成以下的 Syslog 訊息: ```arduino= <34>1 2023-06-05T15:14:00.000Z mymachine.com myapp 1234 TASK_START - Starting task 456 <34>1 2023-06-05T15:15:00.000Z mymachine.com myapp 1234 TASK_PROGRESS - Task 456 is 50% complete <34>1 2023-06-05T15:16:00.000Z mymachine.com myapp 1234 TASK_COMPLETE - Task 456 is complete ``` 在這裡,"<34>1" 是 PRI (facility 是 4,對應到 "auth";severity 是 2,對應到 "info")。"mymachine.com" 是 HOSTNAME,"myapp" 是 APP-NAME (即 event source),"1234" 是 PROCID,而 "TASK_START"、"TASK_PROGRESS" 和 "TASK_COMPLETE" 則是 MSGID。