diff --git a/extensions/openpower-pels/host_interface.hpp b/extensions/openpower-pels/host_interface.hpp
index ee818f3..11ebe87 100644
--- a/extensions/openpower-pels/host_interface.hpp
+++ b/extensions/openpower-pels/host_interface.hpp
@@ -4,7 +4,7 @@
 
 #include <stdint.h>
 
-#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/lg2.hpp>
 #include <sdeventplus/event.hpp>
 #include <sdeventplus/source/io.hpp>
 
@@ -152,10 +152,9 @@
             }
             catch (const std::exception& e)
             {
-                using namespace phosphor::logging;
-                log<level::ERR>(
-                    "Host iface response callback threw an exception",
-                    entry("ERROR=%s", e.what()));
+                lg2::error(
+                    "Host iface response callback threw an exception: {EX}",
+                    "EX", e);
             }
         }
     }
diff --git a/extensions/openpower-pels/host_notifier.cpp b/extensions/openpower-pels/host_notifier.cpp
index 427ec79..b6490ac 100644
--- a/extensions/openpower-pels/host_notifier.cpp
+++ b/extensions/openpower-pels/host_notifier.cpp
@@ -15,7 +15,7 @@
  */
 #include "host_notifier.hpp"
 
-#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/lg2.hpp>
 
 namespace openpower::pels
 {
@@ -23,8 +23,6 @@
 const auto subscriptionName = "PELHostNotifier";
 const size_t maxRetryAttempts = 15;
 
-using namespace phosphor::logging;
-
 HostNotifier::HostNotifier(Repository& repo, DataInterfaceBase& dataIface,
                            std::unique_ptr<HostInterface> hostIface) :
     _repo(repo),
@@ -66,7 +64,7 @@
     // Start sending logs if the host is running
     if (!_pelQueue.empty() && _dataIface.isHostUp())
     {
-        log<level::DEBUG>("Host is already up at startup");
+        lg2::debug("Host is already up at startup");
         _hostUpTimer.restartOnce(_hostIface->getHostUpDelay());
     }
 }
@@ -79,7 +77,7 @@
 
 void HostNotifier::hostUpTimerExpired()
 {
-    log<level::DEBUG>("Host up timer expired");
+    lg2::debug("Host up timer expired");
     doNewLogNotify();
 }
 
@@ -127,8 +125,8 @@
     else
     {
         using namespace phosphor::logging;
-        log<level::ERR>("Host Enqueue: Unable to find PEL ID in repository",
-                        entry("PEL_ID=0x%X", id));
+        lg2::error("Host Enqueue: Unable to find PEL ID {ID} in repository",
+                   "ID", lg2::hex, id);
         required = false;
     }
 
@@ -177,7 +175,8 @@
         return;
     }
 
-    log<level::DEBUG>("new PEL added to queue", entry("PEL_ID=0x%X", pel.id()));
+    lg2::debug("New PEL added to queue, PEL ID = {ID}", "ID", lg2::hex,
+               pel.id());
 
     _pelQueue.push_back(pel.id());
 
@@ -210,23 +209,23 @@
     auto queueIt = std::find(_pelQueue.begin(), _pelQueue.end(), id);
     if (queueIt != _pelQueue.end())
     {
-        log<level::DEBUG>("Host notifier removing deleted log from queue");
+        lg2::debug("Host notifier removing deleted log from queue");
         _pelQueue.erase(queueIt);
     }
 
     auto sentIt = std::find(_sentPELs.begin(), _sentPELs.end(), id);
     if (sentIt != _sentPELs.end())
     {
-        log<level::DEBUG>("Host notifier removing deleted log from sent list");
+        lg2::debug("Host notifier removing deleted log from sent list");
         _sentPELs.erase(sentIt);
     }
 
     // Nothing we can do about this...
     if (id == _inProgressPEL)
     {
-        log<level::WARNING>(
-            "A PEL was deleted while its host notification was in progress",
-            entry("PEL_ID=0x%X", id));
+        lg2::warning(
+            "A PEL was deleted while its host notification was in progress, PEL ID = {ID}",
+            "ID", lg2::hex, id);
     }
 }
 
@@ -261,9 +260,9 @@
             // would be down and isolating that shouldn't left to
             // a logging daemon, so just trace.  Also, this will start
             // trying again when the next new log comes in.
-            log<level::ERR>(
-                "PEL Host notifier hit max retry attempts. Giving up for now.",
-                entry("PEL_ID=0x%X", _pelQueue.front()));
+            lg2::error(
+                "PEL Host notifier hit max retry attempts. Giving up for now. PEL ID = {ID}",
+                "ID", lg2::hex, _pelQueue.front());
 
             // Tell the host interface object to clean itself up, especially to
             // release the PLDM instance ID it's been using.
@@ -296,8 +295,8 @@
             auto size = static_cast<size_t>(
                 std::filesystem::file_size((*attributes).get().path));
 
-            log<level::DEBUG>("sendNewLogCmd", entry("PEL_ID=0x%X", id),
-                              entry("PEL_SIZE=%d", size));
+            lg2::debug("sendNewLogCmd: ID {ID} size {SIZE}", "ID", lg2::hex, id,
+                       "SIZE", size);
 
             auto rc = _hostIface->sendNewLogCmd(id, size);
 
@@ -308,7 +307,8 @@
             else
             {
                 // It failed.  Retry
-                log<level::ERR>("PLDM send failed", entry("PEL_ID=0x%X", id));
+                lg2::error("PLDM send failed, PEL ID = {ID}", "ID", lg2::hex,
+                           id);
                 _pelQueue.push_front(id);
                 _inProgressPEL = 0;
                 _retryTimer.restartOnce(_hostIface->getSendRetryDelay());
@@ -316,8 +316,9 @@
         }
         else
         {
-            log<level::ERR>("PEL ID not in repository.  Cannot notify host",
-                            entry("PEL_ID=0x%X", id));
+            lg2::error(
+                "PEL ID is not in repository. Cannot notify host. PEL ID = {ID}",
+                "ID", lg2::hex, id);
         }
     }
 }
@@ -329,12 +330,12 @@
 
     if (hostUp && !_pelQueue.empty())
     {
-        log<level::DEBUG>("Host state change to on");
+        lg2::debug("Host state change to on");
         _hostUpTimer.restartOnce(_hostIface->getHostUpDelay());
     }
     else if (!hostUp)
     {
-        log<level::DEBUG>("Host state change to off");
+        lg2::debug("Host state change to off");
 
         stopCommand();
 
@@ -367,8 +368,8 @@
 
     if (status == ResponseStatus::success)
     {
-        log<level::DEBUG>("HostNotifier command response success",
-                          entry("PEL_ID=0x%X", id));
+        lg2::debug("HostNotifier command response success, PEL ID = {ID}", "ID",
+                   lg2::hex, id);
         _retryCount = 0;
 
         _sentPELs.push_back(id);
@@ -383,8 +384,8 @@
     }
     else
     {
-        log<level::ERR>("PLDM command response failure",
-                        entry("PEL_ID=0x%X", id));
+        lg2::error("PLDM command response failure, PEL ID = {ID}", "ID",
+                   lg2::hex, id);
         // Retry
         _pelQueue.push_front(id);
         _retryTimer.restartOnce(_hostIface->getReceiveRetryDelay());
@@ -395,8 +396,8 @@
 {
     if (_dataIface.isHostUp())
     {
-        log<level::INFO>("Attempting command retry",
-                         entry("PEL_ID=0x%X", _pelQueue.front()));
+        lg2::info("Attempting command retry, PEL ID = {ID}", "ID", lg2::hex,
+                  _pelQueue.front());
         _retryCount++;
         doNewLogNotify();
     }
@@ -404,7 +405,7 @@
 
 void HostNotifier::hostFullTimerExpired()
 {
-    log<level::DEBUG>("Host full timer expired, trying send again");
+    lg2::debug("Host full timer expired, trying send again");
     doNewLogNotify();
 }
 
@@ -448,7 +449,7 @@
     {
         _hostFull = false;
 
-        log<level::DEBUG>("Host previously full, not anymore after this ack");
+        lg2::debug("Host previously full, not anymore after this ack");
 
         // Start sending PELs again, from the event loop
         if (!_pelQueue.empty())
@@ -460,7 +461,8 @@
 
 void HostNotifier::setHostFull(uint32_t id)
 {
-    log<level::INFO>("Received Host full indication", entry("PEL_ID=0x%X", id));
+    lg2::info("Received Host full indication, PEL ID = {ID}", "ID", lg2::hex,
+              id);
 
     _hostFull = true;
 
@@ -482,14 +484,14 @@
     // host is full is from this timer callback.
     if (!_hostFullTimer.isEnabled())
     {
-        log<level::DEBUG>("Starting host full timer");
+        lg2::debug("Starting host full timer");
         _hostFullTimer.restartOnce(_hostIface->getHostFullRetryDelay());
     }
 }
 
 void HostNotifier::setBadPEL(uint32_t id)
 {
-    log<level::ERR>("PEL rejected by the host", entry("PEL_ID=0x%X", id));
+    lg2::error("PEL rejected by the host, PEL ID = {ID}", "ID", lg2::hex, id);
 
     auto sent = std::find(_sentPELs.begin(), _sentPELs.end(), id);
     if (sent != _sentPELs.end())
diff --git a/extensions/openpower-pels/pldm_interface.cpp b/extensions/openpower-pels/pldm_interface.cpp
index dca8a2d..502cc7d 100644
--- a/extensions/openpower-pels/pldm_interface.cpp
+++ b/extensions/openpower-pels/pldm_interface.cpp
@@ -20,7 +20,7 @@
 #include <systemd/sd-bus.h>
 #include <unistd.h>
 
-#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/lg2.hpp>
 
 #include <fstream>
 
@@ -42,7 +42,6 @@
 constexpr auto pldm_requester = "xyz.openbmc_project.PLDM.Requester";
 }
 
-using namespace phosphor::logging;
 using namespace sdeventplus;
 using namespace sdeventplus::source;
 
@@ -73,7 +72,7 @@
     std::ifstream eidFile{eidPath};
     if (!eidFile.good())
     {
-        log<level::ERR>("Could not open host EID file");
+        lg2::error("Could not open host EID file");
     }
     else
     {
@@ -85,7 +84,7 @@
         }
         else
         {
-            log<level::ERR>("EID file was empty");
+            lg2::error("EID file was empty");
         }
     }
 }
@@ -96,8 +95,8 @@
     if (_fd < 0)
     {
         auto e = errno;
-        log<level::ERR>("pldm_open failed", entry("ERRNO=%d", e),
-                        entry("RC=%d\n", _fd));
+        lg2::error("pldm_open failed.  errno = {ERRNO}, rc = {RC}", "ERRNO", e,
+                   "RC", _fd);
         throw std::exception{};
     }
 }
@@ -106,9 +105,7 @@
 {
     if (!_inProgress)
     {
-        // A cancelCmd was run, just return
-        log<level::INFO>(
-            "A command was canceled while waiting for the instance ID");
+        lg2::info("A command was canceled while waiting for the instance ID");
         return;
     }
 
@@ -117,8 +114,7 @@
     auto rc = sd_bus_message_get_errno(msg);
     if (rc)
     {
-        log<level::ERR>("GetInstanceId D-Bus method failed",
-                        entry("ERRNO=%d", rc));
+        lg2::error("GetInstanceId D-Bus method failed, rc = {RC}", "RC", rc);
         failed = true;
     }
     else
@@ -127,8 +123,8 @@
         rc = sd_bus_message_read_basic(msg, 'y', &id);
         if (rc < 0)
         {
-            log<level::ERR>("Could not read instance ID out of message",
-                            entry("ERROR=%d", rc));
+            lg2::error("Could not read instance ID out of message, rc = {RC}",
+                       "RC", rc);
             failed = true;
         }
         else
@@ -185,9 +181,9 @@
 
     if (rc < 0)
     {
-        log<level::ERR>("Error calling sd_bus_call_method_async",
-                        entry("RC=%d", rc), entry("MSG=%s", strerror(-rc)));
-        throw std::exception{};
+        lg2::error(
+            "Error calling sd_bus_call_method_async, rc = {RC}, msg = {MSG}",
+            "RC", rc, "MSG", strerror(-rc));
     }
 }
 
@@ -240,7 +236,7 @@
                                   request);
     if (rc != PLDM_SUCCESS)
     {
-        log<level::ERR>("encode_new_file_req failed", entry("RC=%d", rc));
+        lg2::error("encode_new_file_req failed, rc = {RC}", "RC", rc);
         throw std::exception{};
     }
 
@@ -248,8 +244,8 @@
     if (rc < 0)
     {
         auto e = errno;
-        log<level::ERR>("pldm_send failed", entry("RC=%d", rc),
-                        entry("ERRNO=%d", e));
+        lg2::error("pldm_send failed, rc = {RC}, errno = {ERRNO}", "RC", rc,
+                   "ERRNO", e);
 
         throw std::exception{};
     }
@@ -282,8 +278,9 @@
         }
 
         auto e = errno;
-        log<level::ERR>("pldm_recv failed", entry("RC=%d", rc),
-                        entry("ERRNO=%d", e));
+        lg2::error("pldm_recv failed, rc = {RC}, errno = {ERRNO}", "RC",
+                   static_cast<std::underlying_type_t<pldm_requester_rc_t>>(rc),
+                   "ERRNO", e);
         status = ResponseStatus::failure;
 
         responseMsg = nullptr;
@@ -303,16 +300,16 @@
                                              &completionCode);
         if (decodeRC < 0)
         {
-            log<level::ERR>("decode_new_file_resp failed",
-                            entry("RC=%d", decodeRC));
+            lg2::error("decode_new_file_resp failed, rc = {RC}", "RC",
+                       decodeRC);
             status = ResponseStatus::failure;
         }
         else
         {
             if (completionCode != PLDM_SUCCESS)
             {
-                log<level::ERR>("Bad PLDM completion code",
-                                entry("COMPLETION_CODE=%d", completionCode));
+                lg2::error("Bad PLDM completion code {CODE}", "CODE",
+                           completionCode);
                 status = ResponseStatus::failure;
             }
         }
@@ -328,7 +325,7 @@
 
 void PLDMInterface::receiveTimerExpired()
 {
-    log<level::ERR>("Timed out waiting for PLDM response");
+    lg2::error("Timed out waiting for PLDM response");
 
     // Cleanup, but keep the instance ID because the host didn't
     // respond so we can still use it.
