[OpenBMC] 从代码谈 Redfish 的Log 机制 (LogService/EventLog)
和往常一樣,OpenBMC中官方對Redfish 的Log 機制已經(jīng)有很詳細(xì)的介紹,所以這篇是結(jié)合一些額外的資料來看整個LogService 的架構(gòu)和原理 (*如果之后OpenBMC架構(gòu)有變,這邊不會再更新)
docs/redfish-logging-in-bmcweb.md at master · openbmc/docs · GitHubhttps://github.com/openbmc/docs/blob/master/architecture/redfish-logging-in-bmcweb.md在Redfish 還沒問世之前,BMC的世界中會將有問題的事件紀(jì)錄成System Event Log (SEL),SEL 在IPMI中是用16 Byte來表示,IPMItool 等工具會將其轉(zhuǎn)換為可讀性高的文字,而在Redfish 協(xié)議中,系統(tǒng)事件的紀(jì)錄(開關(guān)機,溫度異常等)是由LogServices來負(fù)責(zé)監(jiān)控和配置這些事件,OpenBMC將這些系統(tǒng)事件稱Event Log??(LogServices 不只有系統(tǒng)事件,還有包含audit log, crashdump 等,這篇文章只會介紹EventLog)
Journal - Systemd日志
Systemd has its own logging system called the journal; running a separate logging daemon is not required??systemd/Journal - ArchWiki (archlinux.org)
Journal是systemd本身自帶的日誌系統(tǒng),它的log分類是根據(jù)Syslog協(xié)定,透過 "journalctl"指令可以讀取系統(tǒng)日誌,透過設(shè)定檔 /etc/systemd/journald.conf 可以更改Journal 設(shè)定
//透過 "journalctl"指令可以讀取系統(tǒng)日志 > journalctl Jun 25 08:41:09 intel-obmc bmcweb[370]: pam_succeed_if(webserver:auth): requirement "user ingroup redfish" was met by user "root"Rsyslog是一個基于Syslog 的開源軟件程序,可在設(shè)定檔 /etc/rsyslog.conf?中,根據(jù)Journal不同的fields 來將不同的logs存放在相對應(yīng)的檔案和設(shè)定輸出格式。
//加上-o json可以將所有filed用json格式印出來,可以看到"PRIORITY" 這樣就算一個filed,我們也可以自己定義想要的filed,filed的數(shù)量并沒有規(guī)定,名字可以自定義的> journalctl -o json {"_SOURCE_REALTIME_TIMESTAMP": "1624610486273832","PRIORITY": "6","_BOOT_ID": "7f34e1dd99bd4d82add8c4f627da6d2c","_SYSTEMD_INVOCATION_ID": "3fb0bea4b7ef4285bda15cde5c400b56","SYSLOG_FACILITY": "10","MESSAGE": "pam_succeed_if(webserver:auth): requirement \"user ingroup redfish\" was met by user \"root\"","__MONOTONIC_TIMESTAMP": "105559270358","_CMDLINE": "/usr/bin/bmcweb","SYSLOG_IDENTIFIER": "bmcweb","_CAP_EFFECTIVE": "1ffffffffff","__CURSOR": "s=7ece329c23f3447497b13bfd083c9ab9;i=534;b=7f34e1dd99bd4d82add8c4f627da6d2c;m=1893d2a3d6;t=5c5931aeec754;x=a43f04e856ee1bf","_HOSTNAME": "intel-obmc","_SYSTEMD_SLICE": "system.slice","_COMM": "bmcweb","_GID": "0","_SYSTEMD_UNIT": "bmcweb.service","_UID": "0","SYSLOG_TIMESTAMP": "Jun 25 08:41:26 ","_TRANSPORT": "syslog","_MACHINE_ID": "0c1eaebf149d400b851c027c0a218f06","_EXE": "/usr/bin/bmcweb","__REALTIME_TIMESTAMP": "1624610486273876","_SYSTEMD_CGROUP": "/system.slice/bmcweb.service","_PID": "370" }有journal log和filed的概念后,我們來看openbmc中的Rsyslog怎么來分類log,底下是openbmc 中/etc/rsyslog.conf的部分內(nèi)容
openbmc/rsyslog.conf at master · openbmc/openbmc · GitHubhttps://github.com/openbmc/openbmc/blob/master/meta-intel-openbmc/meta-common/recipes-extended/rsyslog/rsyslog/rsyslog.conf
# Template for Redfish messages # "<timestamp> <MessageId>,<MessageArgs>" template(name="RedfishTemplate" type="list") {property(name="timereported" dateFormat="rfc3339")constant(value=" ")property(name="$!REDFISH_MESSAGE_ID")constant(value=",")property(name="$!REDFISH_MESSAGE_ARGS")constant(value="\n") }# If the journal entry has a Redfish MessageId, save as a Redfish event if ($!REDFISH_MESSAGE_ID != "") then {action(type="omfile" file="/var/log/redfish" template="RedfishTemplate") }分類步驟
1.?判斷l(xiāng)og有無REDFISH_MESSAGE_ID這個filed
# If the journal entry has a Redfish MessageId, save as a Redfish event if ($!REDFISH_MESSAGE_ID != "") then {action(type="omfile" file="/var/log/redfish" template="RedfishTemplate") }2.?用redfishtemplate格式存入/var/log/redfish中
template(name="RedfishTemplate" type="list") {property(name="timereported" dateFormat="rfc3339")constant(value=" ")property(name="!REDFISHMESSAGEID")constant(value=",")property(name="!REDFISH_MESSAGE_ARGS")constant(value="\n") }3.?redfish會去/var/log/redfish中撈資料 (GET: /redfish/v1/Systems/system/LogServices/EventLog/Entries/)
// redfish-core\lib\log_services.hpp static boolgetRedfishLogFiles(std::vector<std::filesystem::path>& redfishLogFiles) {static const std::filesystem::path redfishLogDir = "/var/log";static const std::string redfishLogFilename = "redfish";... }inline void requestRoutesJournalEventLogEntryCollection(App& app) {BMCWEB_ROUTE(app,"/redfish/v1/Systems/system/LogServices/EventLog/Entries/").privileges(redfish::privileges::getLogEntryCollection).methods(boost::beast::http::verb::get)(...getRedfishLogFiles(redfishLogFiles);...) }新增redfish log可以透過sd_journal_send ,例如
(REDFISH_MESSAGE_ID是必要的,REDFISH_MESSAGE_ARGS則依情況而定)
sd_journal_send("MESSAGE=%s", "journal text", "PRIORITY=%i", <LOG_LEVEL>,"REDFISH_MESSAGE_ID=%s","ResourceEvent.1.0.ResourceErrorThresholdExceeded","REDFISH_MESSAGE_ARGS=%s,%d", "Property Name",propertyValue, NULL);Message Registry?
REDFISH_MESSAGE_ID?和?REDFISH_MESSAGE_ARGS要填的內(nèi)容就要參考Message registry
我們先來看一個registry的范例 [GET] /redfish/v1/Registries/OpenBMC/OpenBMC
bmcweb/openbmc_message_registry.hpp at master · openbmc/bmcweb · GitHub
{"@Redfish.Copyright": "Copyright 2018 OpenBMC. All rights reserved.","@odata.type": "#MessageRegistry.v1_4_0.MessageRegistry","Description": "This registry defines the base messages for OpenBMC.","Id": "OpenBMC.0.1.0","Language": "en","Messages": {"SystemPowerOnFailed": {"Description": "Indicates that the system failed to power on.","Message": "System Power-On Failed.","MessageSeverity": "Critical","NumberOfArgs": 0,"Resolution": "None.","Severity": "Critical"}},"VoltageRegulatorOverheated": {"Description": "Indicates that the specified voltage regulator overheated.","Message": "%1 Voltage Regulator Overheated.","MessageSeverity": "Critical","NumberOfArgs": 1,"ParamTypes": ["string"],"Resolution": "None.","Severity": "Critical"}},"Name": "OpenBMC Message Registry","OwningEntity": "OpenBMC","RegistryPrefix": "OpenBMC","RegistryVersion": "0.1.0" }Message registry 是Redfish的一個Resource,中文翻譯叫"注冊表",簡單來說就是Redfish 會將它想傳遞的訊息(例如EventLog)先注冊在Message registry中,在runtime的時候會透過MessageId (REDFISH_MESSAGE_ID)來將相對應(yīng)的訊息輸出。
Redfish spec對MessageId的定義
?一個MessageId組成對應(yīng)registry如下
如果想要記個 VoltageRegulatorOverheated的Event Log,
- REDFISH_MESSAGE_ID = OpenBMC.0.1.VoltageRegulatorOverheated
- REDFISH_MESSAGE_ARGS可以帶"CPU 0"
程式碼寫法如下
sd_journal_send("MESSAGE=%s", "journal text", "PRIORITY=%i", <LOG_LEVEL>,"REDFISH_MESSAGE_ID=%s","OpenBMC.0.1.VoltageRegulatorOverheated","REDFISH_MESSAGE_ARGS=%s", "CPU 0", NULL); > cat /var/log/redfish1970-01-01T00:00:15.077204+00:00 OpenBMC.0.1.VoltageRegulatorOverheated,CPU 0Redfish 會透過REDFISH_MESSAGE_ID 將Event log翻譯成可讀性高的文字訊息,其中l(wèi)og的一些property是可以和剛剛上面提的message prefix相對應(yīng)的
{"@odata.id": "/redfish/v1/Systems/system/LogServices/EventLog/Entries/15_2","@odata.type": "#LogEntry.v1_4_0.LogEntry","Created": "1970-01-01T00:00:15+00:00","EntryType": "Event","Id": "15_2","Message": "CPU 0 Voltage Regulator Overheated.","MessageArgs": ["CPU 0"],"MessageId": "OpenBMC.0.1.VoltageRegulatorOverheated","Name": "System Event Log Entry","Severity": "Critical" }目前openBMC支援的prefix有Base, TaskEvents, ResourceEvent, OpenBMC四種,可以在bmcweb/redfish-core/include/registries at master · openbmc/bmcweb · GitHub?或透過GET /redfish/v1/Registries 看到
最后,LogService的架構(gòu)如下
可以透過 /redfish/v1/Systems/system/LogServices/EventLog/Entries 取得Event Log
總結(jié)
以上是生活随笔為你收集整理的[OpenBMC] 从代码谈 Redfish 的Log 机制 (LogService/EventLog)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 使用PMSM控制的puma560机械臂简
- 下一篇: DB2 SQLCODE 异常大全编辑(一
