Add SEL_LOGGER_SEND_TO_LOGGING_SERVICE option

When enabled, the sel logger sends the SEL data to logging service
instead of journal.

The logging service will create a logging entry with related metadata,
so that it could be used for ipmid to convert to SEL entry.

Tested: Verify the logging entry is created as below example:

    # Add OEM SEL
    busctl call "xyz.openbmc_project.Logging.IPMI" "/xyz/openbmc_project/Logging/IPMI" xyz.openbmc_project.Logging.IPMI IpmiSelAddOem sayy "b370836ccf2f4850ac5bee185b77893a" 9 0x00 0xdd 0xb3 0xba 0xcd 0x00 0x01 0x00 0x00 0xcd
    # logging entry:
    "data": {
      "AdditionalData": [
        "EVENT_DIR=0",
        "GENERATE_ID=0",
        "IS_OEM=1",
        "RECORD_TYPE=205",
        "SENSOR_DATA=00DDB3BACD00010000",
        "SENSOR_PATH=",
        "_PID=198"
      ],
      "Associations": [],
      "Id": 1,
      "Message": "xyz.openbmc_project.Logging.SEL.Error.Created",
      "Purpose": "xyz.openbmc_project.Software.Version.VersionPurpose.BMC",
      "Resolved": false,
      "Severity": "xyz.openbmc_project.Logging.Entry.Level.Informational",
      "Timestamp": 86022,
      "UpdateTimestamp": 86022,
      "Version": "2.9.0-dev-1308-g01b7feb91-dirty"
    },

    # Add regular SEL record
    busctl call "xyz.openbmc_project.Logging.IPMI" "/xyz/openbmc_project/Logging/IPMI" xyz.openbmc_project.Logging.IPMI IpmiSelAdd ssaybq "MyTestMessage" "InvalidPath" 3 0x01 0x02 0x03 true 0x2000
    # logging entry:
    "data": {
      "AdditionalData": [
        "EVENT_DIR=1",
        "GENERATE_ID=8192",
        "IS_OEM=0",
        "RECORD_TYPE=2",
        "SENSOR_DATA=010203",
        "SENSOR_PATH=InvalidPath",
        "_PID=512"
      ],
      "Associations": [],
      "Id": 2,
      "Message": "xyz.openbmc_project.Logging.SEL.Error.Created",
      "Purpose": "xyz.openbmc_project.Software.Version.VersionPurpose.BMC",
      "Resolved": false,
      "Severity": "xyz.openbmc_project.Logging.Entry.Level.Informational",
      "Timestamp": 458713,
      "UpdateTimestamp": 458713,
      "Version": "2.9.0-dev-1312-g30641eb10"
    },

Signed-off-by: Lei YU <yulei.sh@bytedance.com>
Change-Id: I01aa0af2b9ba6211d1f447106f82cfa264ef877a
diff --git a/src/sel_logger.cpp b/src/sel_logger.cpp
index 5f330e0..7fb19ef 100644
--- a/src/sel_logger.cpp
+++ b/src/sel_logger.cpp
@@ -30,6 +30,17 @@
 #include <iostream>
 #include <sstream>
 
+#ifdef SEL_LOGGER_SEND_TO_LOGGING_SERVICE
+#include <phosphor-logging/elog-errors.hpp>
+#include <phosphor-logging/elog.hpp>
+#include <phosphor-logging/log.hpp>
+#include <xyz/openbmc_project/Logging/SEL/error.hpp>
+
+using namespace phosphor::logging;
+using SELCreated =
+    sdbusplus::xyz::openbmc_project::Logging::SEL::Error::Created;
+#endif
+
 struct DBusInternalError final : public sdbusplus::exception_t
 {
     const char* name() const noexcept override
@@ -47,6 +58,7 @@
     };
 };
 
+#ifndef SEL_LOGGER_SEND_TO_LOGGING_SERVICE
 static bool getSELLogFiles(std::vector<std::filesystem::path>& selLogFiles)
 {
     // Loop through the directory looking for ipmi_sel log files
@@ -115,6 +127,7 @@
     }
     return recordId;
 }
+#endif
 
 static void toHexStr(const std::vector<uint8_t>& data, std::string& hexStr)
 {
@@ -141,6 +154,14 @@
     std::string selDataStr;
     toHexStr(selData, selDataStr);
 
+#ifdef SEL_LOGGER_SEND_TO_LOGGING_SERVICE
+    using namespace xyz::openbmc_project::Logging::SEL;
+    report<SELCreated>(
+        Created::RECORD_TYPE(selSystemType), Created::GENERATOR_ID(genId),
+        Created::SENSOR_DATA(selDataStr.c_str()), Created::EVENT_DIR(assert),
+        Created::SENSOR_PATH(path.c_str()));
+    return 0;
+#else
     unsigned int recordId = getNewRecordId();
     sd_journal_send("MESSAGE=%s", message.c_str(), "PRIORITY=%i", selPriority,
                     "MESSAGE_ID=%s", selMessageId, "IPMI_SEL_RECORD_ID=%d",
@@ -150,6 +171,7 @@
                     "IPMI_SEL_EVENT_DIR=%x", assert, "IPMI_SEL_DATA=%s",
                     selDataStr.c_str(), std::forward<T>(metadata)..., NULL);
     return recordId;
+#endif
 }
 
 static uint16_t selAddOemRecord(const std::string& message,
@@ -164,12 +186,21 @@
     std::string selDataStr;
     toHexStr(selData, selDataStr);
 
+#ifdef SEL_LOGGER_SEND_TO_LOGGING_SERVICE
+    using namespace xyz::openbmc_project::Logging::SEL;
+    report<SELCreated>(Created::RECORD_TYPE(recordType),
+                       Created::GENERATOR_ID(0),
+                       Created::SENSOR_DATA(selDataStr.c_str()),
+                       Created::EVENT_DIR(0), Created::SENSOR_PATH(""));
+    return 0;
+#else
     unsigned int recordId = getNewRecordId();
     sd_journal_send("MESSAGE=%s", message.c_str(), "PRIORITY=%i", selPriority,
                     "MESSAGE_ID=%s", selMessageId, "IPMI_SEL_RECORD_ID=%d",
                     recordId, "IPMI_SEL_RECORD_TYPE=%x", recordType,
                     "IPMI_SEL_DATA=%s", selDataStr.c_str(), NULL);
     return recordId;
+#endif
 }
 
 int main(int argc, char* argv[])