diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index a31d738..e1f3fb6 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -27,6 +27,7 @@
 #include "utils/dbus_event_log_entry.hpp"
 #include "utils/dbus_utils.hpp"
 #include "utils/json_utils.hpp"
+#include "utils/log_services_utils.hpp"
 #include "utils/query_param.hpp"
 #include "utils/time_utils.hpp"
 
@@ -595,95 +596,6 @@
         std::format("{}/entry/{}", getDumpPath(dumpType), entryID),
         "xyz.openbmc_project.Object.Delete", "Delete");
 }
-inline bool checkSizeLimit(int fd, crow::Response& res)
-{
-    long long int size = lseek(fd, 0, SEEK_END);
-    if (size <= 0)
-    {
-        BMCWEB_LOG_ERROR("Failed to get size of file, lseek() returned {}",
-                         size);
-        messages::internalError(res);
-        return false;
-    }
-
-    // Arbitrary max size of 20MB to accommodate BMC dumps
-    constexpr long long int maxFileSize = 20LL * 1024LL * 1024LL;
-    if (size > maxFileSize)
-    {
-        BMCWEB_LOG_ERROR("File size {} exceeds maximum allowed size of {}",
-                         size, maxFileSize);
-        messages::internalError(res);
-        return false;
-    }
-    off_t rc = lseek(fd, 0, SEEK_SET);
-    if (rc < 0)
-    {
-        BMCWEB_LOG_ERROR("Failed to reset file offset to 0");
-        messages::internalError(res);
-        return false;
-    }
-    return true;
-}
-inline void downloadEntryCallback(
-    const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
-    const std::string& entryID, const std::string& downloadEntryType,
-    const boost::system::error_code& ec,
-    const sdbusplus::message::unix_fd& unixfd)
-{
-    if (ec.value() == EBADR)
-    {
-        messages::resourceNotFound(asyncResp->res, "EntryAttachment", entryID);
-        return;
-    }
-    if (ec)
-    {
-        BMCWEB_LOG_ERROR("DBUS response error: {}", ec);
-        messages::internalError(asyncResp->res);
-        return;
-    }
-
-    // Make sure we know how to process the retrieved entry attachment
-    if ((downloadEntryType != "BMC") && (downloadEntryType != "System"))
-    {
-        BMCWEB_LOG_ERROR("downloadEntryCallback() invalid entry type: {}",
-                         downloadEntryType);
-        messages::internalError(asyncResp->res);
-    }
-
-    int fd = -1;
-    fd = dup(unixfd);
-    if (fd < 0)
-    {
-        BMCWEB_LOG_ERROR("Failed to open file");
-        messages::internalError(asyncResp->res);
-        return;
-    }
-    if (!checkSizeLimit(fd, asyncResp->res))
-    {
-        close(fd);
-        return;
-    }
-    if (downloadEntryType == "System")
-    {
-        if (!asyncResp->res.openFd(fd, bmcweb::EncodingType::Base64))
-        {
-            messages::internalError(asyncResp->res);
-            close(fd);
-            return;
-        }
-        asyncResp->res.addHeader(
-            boost::beast::http::field::content_transfer_encoding, "Base64");
-        return;
-    }
-    if (!asyncResp->res.openFd(fd))
-    {
-        messages::internalError(asyncResp->res);
-        close(fd);
-        return;
-    }
-    asyncResp->res.addHeader(boost::beast::http::field::content_type,
-                             "application/octet-stream");
-}
 
 inline void downloadDumpEntry(
     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
@@ -703,7 +615,8 @@
         [asyncResp, entryID,
          dumpType](const boost::system::error_code& ec,
                    const sdbusplus::message::unix_fd& unixfd) {
-            downloadEntryCallback(asyncResp, entryID, dumpType, ec, unixfd);
+            log_services_utils::downloadEntryCallback(asyncResp, entryID,
+                                                      dumpType, ec, unixfd);
         };
 
     dbus::utility::async_method_call(
@@ -739,7 +652,8 @@
         [asyncResp, entryID,
          dumpType](const boost::system::error_code& ec,
                    const sdbusplus::message::unix_fd& unixfd) {
-            downloadEntryCallback(asyncResp, entryID, dumpType, ec, unixfd);
+            log_services_utils::downloadEntryCallback(asyncResp, entryID,
+                                                      dumpType, ec, unixfd);
         };
 
     dbus::utility::async_method_call(
