diff --git a/redfish-core/include/utils/dbus_event_log_entry.hpp b/redfish-core/include/utils/dbus_event_log_entry.hpp
new file mode 100644
index 0000000..f5eb5f6
--- /dev/null
+++ b/redfish-core/include/utils/dbus_event_log_entry.hpp
@@ -0,0 +1,52 @@
+#pragma once
+
+#include "dbus_utility.hpp"
+#include "utils/dbus_utils.hpp"
+
+#include <optional>
+#include <string>
+
+namespace redfish
+{
+struct DbusEventLogEntry
+{
+    // represents a subset of an instance of dbus interface
+    // xyz.openbmc_project.Logging.Entry
+
+    uint32_t Id = 0;
+    std::string Message;
+    const std::string* Path = nullptr;
+    const std::string* Resolution = nullptr;
+    bool Resolved = false;
+    std::string ServiceProviderNotify;
+    std::string Severity;
+    uint64_t Timestamp = 0;
+    uint64_t UpdateTimestamp = 0;
+};
+
+inline std::optional<DbusEventLogEntry> fillDbusEventLogEntryFromPropertyMap(
+    const dbus::utility::DBusPropertiesMap& resp)
+{
+    DbusEventLogEntry entry;
+
+    // clang-format off
+    bool success = sdbusplus::unpackPropertiesNoThrow(
+        dbus_utils::UnpackErrorPrinter(), resp,
+        "Id", entry.Id,
+        "Message", entry.Message,
+        "Path", entry.Path,
+        "Resolution", entry.Resolution,
+        "Resolved", entry.Resolved,
+        "ServiceProviderNotify", entry.ServiceProviderNotify,
+        "Severity", entry.Severity,
+        "Timestamp", entry.Timestamp,
+        "UpdateTimestamp", entry.UpdateTimestamp
+    );
+    // clang-format on
+    if (!success)
+    {
+        return std::nullopt;
+    }
+    return entry;
+}
+} // namespace redfish
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index c8b01ea..639a314 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -30,6 +30,7 @@
 #include "registries/privilege_registry.hpp"
 #include "task.hpp"
 #include "task_messages.hpp"
+#include "utils/dbus_event_log_entry.hpp"
 #include "utils/dbus_utils.hpp"
 #include "utils/json_utils.hpp"
 #include "utils/time_utils.hpp"
@@ -1418,64 +1419,46 @@
     const dbus::utility::DBusPropertiesMap& resp,
     nlohmann::json& objectToFillOut)
 {
-    uint32_t id = 0;
-    uint64_t timestamp = 0;
-    uint64_t updateTimestamp = 0;
-    std::string severity;
-    std::string message;
-    const std::string* filePath = nullptr;
-    const std::string* resolution = nullptr;
-    bool resolved = false;
-    std::string notify;
-    // clang-format off
-    bool success = sdbusplus::unpackPropertiesNoThrow(
-        dbus_utils::UnpackErrorPrinter(), resp,
-        "Id", id,
-        "Message", message,
-        "Path", filePath,
-        "Resolution", resolution,
-        "Resolved", resolved,
-        "ServiceProviderNotify", notify,
-        "Severity", severity,
-        "Timestamp", timestamp,
-        "UpdateTimestamp", updateTimestamp
-    );
-    // clang-format on
+    std::optional<DbusEventLogEntry> optEntry =
+        fillDbusEventLogEntryFromPropertyMap(resp);
 
-    if (!success)
+    if (!optEntry.has_value())
     {
         messages::internalError(asyncResp->res);
         return;
     }
+    DbusEventLogEntry entry = optEntry.value();
 
     objectToFillOut["@odata.type"] = "#LogEntry.v1_9_0.LogEntry";
     objectToFillOut["@odata.id"] = boost::urls::format(
         "/redfish/v1/Systems/{}/LogServices/EventLog/Entries/{}",
-        BMCWEB_REDFISH_SYSTEM_URI_NAME, std::to_string(id));
+        BMCWEB_REDFISH_SYSTEM_URI_NAME, std::to_string(entry.Id));
     objectToFillOut["Name"] = "System Event Log Entry";
-    objectToFillOut["Id"] = std::to_string(id);
-    objectToFillOut["Message"] = message;
-    objectToFillOut["Resolved"] = resolved;
-    std::optional<bool> notifyAction = getProviderNotifyAction(notify);
+    objectToFillOut["Id"] = std::to_string(entry.Id);
+    objectToFillOut["Message"] = entry.Message;
+    objectToFillOut["Resolved"] = entry.Resolved;
+    std::optional<bool> notifyAction =
+        getProviderNotifyAction(entry.ServiceProviderNotify);
     if (notifyAction)
     {
         objectToFillOut["ServiceProviderNotified"] = *notifyAction;
     }
-    if ((resolution != nullptr) && !resolution->empty())
+    if ((entry.Resolution != nullptr) && !entry.Resolution->empty())
     {
-        objectToFillOut["Resolution"] = *resolution;
+        objectToFillOut["Resolution"] = *entry.Resolution;
     }
     objectToFillOut["EntryType"] = "Event";
-    objectToFillOut["Severity"] = translateSeverityDbusToRedfish(severity);
+    objectToFillOut["Severity"] =
+        translateSeverityDbusToRedfish(entry.Severity);
     objectToFillOut["Created"] =
-        redfish::time_utils::getDateTimeUintMs(timestamp);
+        redfish::time_utils::getDateTimeUintMs(entry.Timestamp);
     objectToFillOut["Modified"] =
-        redfish::time_utils::getDateTimeUintMs(updateTimestamp);
-    if (filePath != nullptr)
+        redfish::time_utils::getDateTimeUintMs(entry.UpdateTimestamp);
+    if (entry.Path != nullptr)
     {
         objectToFillOut["AdditionalDataURI"] = boost::urls::format(
             "/redfish/v1/Systems/{}/LogServices/EventLog/Entries/{}/attachment",
-            BMCWEB_REDFISH_SYSTEM_URI_NAME, std::to_string(id));
+            BMCWEB_REDFISH_SYSTEM_URI_NAME, std::to_string(entry.Id));
     }
 }
 
