diff --git a/dump-extensions/openpower-dumps/dump_manager_resource.cpp b/dump-extensions/openpower-dumps/dump_manager_resource.cpp
index 93ce98c..9c39b0a 100644
--- a/dump-extensions/openpower-dumps/dump_manager_resource.cpp
+++ b/dump-extensions/openpower-dumps/dump_manager_resource.cpp
@@ -7,10 +7,9 @@
 #include "resource_dump_entry.hpp"
 #include "xyz/openbmc_project/Common/error.hpp"
 
-#include <fmt/core.h>
-
 #include <phosphor-logging/elog-errors.hpp>
 #include <phosphor-logging/elog.hpp>
+#include <phosphor-logging/lg2.hpp>
 
 namespace openpower
 {
@@ -45,11 +44,9 @@
         if ((resEntry->sourceDumpId() == dumpId) &&
             (resEntry->status() == phosphor::dump::OperationStatus::Completed))
         {
-            log<level::INFO>(
-                fmt::format("Resource dump entry with source dump id({}) is "
-                            "already present with entry id({})",
-                            dumpId, resEntry->getDumpId())
-                    .c_str());
+            lg2::info("Resource dump entry with source dump id: {DUMP_ID} "
+                      "is already present with entry id: {ENTRY_ID}",
+                      "DUMP_ID", dumpId, "ENTRY_ID", resEntry->getDumpId());
             return;
         }
 
@@ -66,11 +63,10 @@
     }
     if (upEntry != NULL)
     {
-        log<level::INFO>(
-            fmt::format("Resource Dump Notify: Updating dumpId({}) "
-                        "with source Id({}) Size({})",
-                        upEntry->getDumpId(), dumpId, size)
-                .c_str());
+        lg2::info("Resource Dump Notify: Updating dumpId: {DUMP_ID} with "
+                  "source Id: {SOURCE_ID} Size: {SIZE}",
+                  "DUMP_ID", upEntry->getDumpId(), "SOURCE_ID", dumpId, "SIZE",
+                  size);
         upEntry->update(timeStamp, size, dumpId);
         return;
     }
@@ -85,10 +81,10 @@
 
     try
     {
-        log<level::INFO>(fmt::format("Resouce Dump Notify: creating new dump "
-                                     "entry dumpId({}) Id({}) Size({})",
-                                     id, dumpId, size)
-                             .c_str());
+        lg2::info(
+            "Resouce Dump Notify: creating new dump entry dumpId: {DUMP_ID} "
+            "Id: {ID} Size: {SIZE}",
+            "DUMP_ID", id, "ID", dumpId, "SIZE", size);
         entries.insert(std::make_pair(
             id, std::make_unique<resource::Entry>(
                     bus, objPath.c_str(), id, timeStamp, size, dumpId,
@@ -98,12 +94,12 @@
     }
     catch (const std::invalid_argument& e)
     {
-        log<level::ERR>(fmt::format("Error in creating resource dump entry, "
-                                    "errormsg({}),OBJECTPATH({}),ID({}),"
-                                    "TIMESTAMP({}),SIZE({}),SOURCEID({})",
-                                    e.what(), objPath.c_str(), id, timeStamp,
-                                    size, dumpId)
-                            .c_str());
+        lg2::error(
+            "Error in creating resource dump entry, errormsg: {ERROR}, "
+            "OBJECTPATH: {OBJECT_PATH}, ID: {ID}, TIMESTAMP: {TIMESTAMP}, "
+            "SIZE: {SIZE}, SOURCEID: {SOURCE_ID}",
+            "ERROR", e, "OBJECT_PATH", objPath, "ID", id, "TIMESTAMP",
+            timeStamp, "SIZE", size, "SOURCE_ID", dumpId);
         report<InternalFailure>();
         return;
     }
@@ -147,7 +143,7 @@
     {
         // Host will generate a default dump if no resource selector string
         // is provided. The default dump will be a non-disruptive system dump.
-        log<level::INFO>(
+        lg2::info(
             "VSP string is not provided, a non-disruptive system dump will be "
             "generated by the host");
     }
@@ -160,10 +156,8 @@
         catch (const std::bad_variant_access& e)
         {
             // Exception will be raised if the input is not string
-            log<level::ERR>(
-                fmt::format("An invalid  vsp string is passed errormsg({})",
-                            e.what())
-                    .c_str());
+            lg2::error("An invalid vsp string is passed, errormsg: {ERROR}",
+                       "ERROR", e);
             elog<InvalidArgument>(Argument::ARGUMENT_NAME("VSP_STRING"),
                                   Argument::ARGUMENT_VALUE("INVALID INPUT"));
         }
@@ -175,7 +169,7 @@
             convertCreateParametersToString(CreateParameters::Password));
     if (iter == params.end())
     {
-        log<level::INFO>("Password is not provided for resource dump");
+        lg2::info("Password is not provided for resource dump");
     }
     else
     {
@@ -186,10 +180,9 @@
         catch (const std::bad_variant_access& e)
         {
             // Exception will be raised if the input is not string
-            log<level::ERR>(
-                fmt::format("An invalid password string is passed errormsg({})",
-                            e.what())
-                    .c_str());
+            lg2::error(
+                "An invalid password string is passed, errormsg: {ERROR}",
+                "ERROR", e);
             elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSWORD"),
                                   Argument::ARGUMENT_VALUE("INVALID INPUT"));
         }
@@ -212,12 +205,11 @@
     }
     catch (const std::invalid_argument& e)
     {
-        log<level::ERR>(
-            fmt::format(
-                "Error in creating resource dump "
-                "entry,errormsg({}),OBJECTPATH({}), VSPSTRING({}), ID({})",
-                e.what(), objPath.c_str(), vspString, id)
-                .c_str());
+        lg2::error(
+            "Error in creating resource dump entry, errormsg: {ERROR}, "
+            "OBJECTPATH: {OBJECT_PATH}, VSPSTRING: {VSP_STRING}, ID: {ID}",
+            "ERROR", e, "OBJECT_PATH", objPath, "VSP_STRING", vspString, "ID",
+            id);
         elog<InternalFailure>();
         return std::string();
     }
