diff --git a/src/button_handler.cpp b/src/button_handler.cpp
index 4072e1d..b1c7ef9 100644
--- a/src/button_handler.cpp
+++ b/src/button_handler.cpp
@@ -2,7 +2,7 @@
 
 #include "button_handler.hpp"
 
-#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/lg2.hpp>
 #include <xyz/openbmc_project/State/Chassis/server.hpp>
 #include <xyz/openbmc_project/State/Host/server.hpp>
 namespace phosphor
@@ -12,7 +12,6 @@
 
 namespace sdbusRule = sdbusplus::bus::match::rules;
 using namespace sdbusplus::xyz::openbmc_project::State::server;
-using namespace phosphor::logging;
 
 constexpr auto chassisIface = "xyz.openbmc_project.State.Chassis";
 constexpr auto hostIface = "xyz.openbmc_project.State.Host";
@@ -39,7 +38,7 @@
     {
         if (!getService(POWER_DBUS_OBJECT_NAME, powerButtonIface).empty())
         {
-            log<level::INFO>("Starting power button handler");
+            lg2::info("Starting power button handler");
             powerButtonReleased = std::make_unique<sdbusplus::bus::match_t>(
                 bus,
                 sdbusRule::type::signal() + sdbusRule::member("Released") +
@@ -68,7 +67,7 @@
     {
         if (!getService(ID_DBUS_OBJECT_NAME, idButtonIface).empty())
         {
-            log<level::INFO>("Registering ID button handler");
+            lg2::info("Registering ID button handler");
             idButtonReleased = std::make_unique<sdbusplus::bus::match_t>(
                 bus,
                 sdbusRule::type::signal() + sdbusRule::member("Released") +
@@ -87,7 +86,7 @@
     {
         if (!getService(RESET_DBUS_OBJECT_NAME, resetButtonIface).empty())
         {
-            log<level::INFO>("Registering reset button handler");
+            lg2::info("Registering reset button handler");
             resetButtonReleased = std::make_unique<sdbusplus::bus::match_t>(
                 bus,
                 sdbusRule::type::signal() + sdbusRule::member("Released") +
@@ -126,7 +125,7 @@
 
     if (HSService.empty())
     {
-        log<level::INFO>("Host Selector dbus object not available");
+        lg2::info("Host Selector dbus object not available");
         throw std::invalid_argument("Host selector dbus object not available");
     }
 
@@ -145,8 +144,7 @@
     }
     catch (const sdbusplus::exception::exception& e)
     {
-        log<level::ERR>("Error reading Host selector Position",
-                        entry("ERROR=%s", e.what()));
+        lg2::error("Error reading Host selector Position: {ERROR}", "ERROR", e);
         throw;
     }
 }
@@ -179,8 +177,8 @@
     if (isMultiHostSystem)
     {
         hostNumber = getHostSelectorValue();
-        log<level::INFO>("Multi host system detected : ",
-                         entry("POSITION=%d", hostNumber));
+        lg2::info("Multi host system detected : {POSITION}", "POSITION",
+                  hostNumber);
     }
 
     std::string hostNumStr = std::to_string(hostNumber);
@@ -189,8 +187,8 @@
     if (isMultiHostSystem && (hostNumber == BMC_POSITION) &&
         (powerEventType != PowerEvent::longPowerPressed))
     {
-        log<level::INFO>("handlePowerEvent : BMC selected on multihost system."
-                         "ignoring power and reset button events...");
+        lg2::info(
+            "handlePowerEvent : BMC selected on multihost system. ignoring power and reset button events...");
         return;
     }
 
@@ -208,7 +206,7 @@
             {
                 transition = Host::Transition::Off;
             }
-            log<level::INFO>("handlePowerEvent : handle power button press ");
+            lg2::info("handlePowerEvent : handle power button press ");
 
             break;
         }
@@ -236,12 +234,10 @@
             }
             else if (!poweredOn(hostNumber))
             {
-                log<level::INFO>(
-                    "Power is off so ignoring long power button press");
+                lg2::info("Power is off so ignoring long power button press");
                 return;
             }
-            log<level::INFO>(
-                "handlePowerEvent : handle long power button press");
+            lg2::info("handlePowerEvent : handle long power button press");
 
             break;
         }
@@ -254,19 +250,19 @@
 
             if (!poweredOn(hostNumber))
             {
-                log<level::INFO>("Power is off so ignoring reset button press");
+                lg2::info("Power is off so ignoring reset button press");
                 return;
             }
 
-            log<level::INFO>("Handling reset button press");
+            lg2::info("Handling reset button press");
             transition = Host::Transition::Reboot;
             break;
         }
         default:
         {
-            log<level::ERR>(
-                "Invalid power event. skipping...",
-                entry("EVENT=%d", static_cast<int>(powerEventType)));
+            lg2::error("{EVENT} is invalid power event. skipping...", "EVENT",
+                       static_cast<std::underlying_type_t<PowerEvent>>(
+                           powerEventType));
 
             return;
         }
@@ -285,8 +281,8 @@
     }
     catch (const sdbusplus::exception::exception& e)
     {
-        log<level::ERR>("Failed power state change on a power button press",
-                        entry("ERROR=%s", e.what()));
+        lg2::error("Failed power state change on a power button press: {ERROR}",
+                   "ERROR", e);
     }
 }
 void Handler::longPowerPressed(sdbusplus::message::message& /* msg */)
@@ -297,8 +293,8 @@
     }
     catch (const sdbusplus::exception::exception& e)
     {
-        log<level::ERR>("Failed powering off on long power button press",
-                        entry("ERROR=%s", e.what()));
+        lg2::error("Failed powering off on long power button press: {ERROR}",
+                   "ERROR", e);
     }
 }
 
@@ -310,8 +306,8 @@
     }
     catch (const sdbusplus::exception::exception& e)
     {
-        log<level::ERR>("Failed power state change on a reset button press",
-                        entry("ERROR=%s", e.what()));
+        lg2::error("Failed power state change on a reset button press: {ERROR}",
+                   "ERROR", e);
     }
 }
 
@@ -324,8 +320,8 @@
 
     if (service.empty())
     {
-        log<level::INFO>("No identify LED group found during ID button press",
-                         entry("GROUP=%s", groupPath.c_str()));
+        lg2::info("No found {GROUP} during ID button press:", "GROUP",
+                  groupPath);
         return;
     }
 
@@ -341,9 +337,9 @@
 
         state = !std::get<bool>(state);
 
-        log<level::INFO>("Changing ID LED group state on ID LED press",
-                         entry("GROUP=%s", groupPath.c_str()),
-                         entry("STATE=%d", std::get<bool>(state)));
+        lg2::info(
+            "Changing ID LED group state on ID LED press, GROUP = {GROUP}, STATE = {STATE}",
+            "GROUP", groupPath, "STATE", std::get<bool>(state));
 
         method = bus.new_method_call(service.c_str(), groupPath.c_str(),
                                      propertyIface, "Set");
@@ -353,8 +349,8 @@
     }
     catch (const sdbusplus::exception::exception& e)
     {
-        log<level::ERR>("Error toggling ID LED group on ID button press",
-                        entry("ERROR=%s", e.what()));
+        lg2::error("Error toggling ID LED group on ID button press: {ERROR}",
+                   "ERROR", e);
     }
 }
 } // namespace button
diff --git a/src/gpio.cpp b/src/gpio.cpp
index faf5639..9f8b98d 100644
--- a/src/gpio.cpp
+++ b/src/gpio.cpp
@@ -18,19 +18,19 @@
 
 #include "gpio.hpp"
 
+#include <error.h>
 #include <fcntl.h>
 #include <unistd.h>
 
 #include <gpioplus/utility/aspeed.hpp>
 #include <nlohmann/json.hpp>
-#include <phosphor-logging/log.hpp>
+#include <phosphor-logging/lg2.hpp>
 
 #include <filesystem>
 #include <fstream>
 
 const std::string gpioDev = "/sys/class/gpio";
 
-using namespace phosphor::logging;
 namespace fs = std::filesystem;
 
 void closeGpio(int fd)
@@ -68,7 +68,7 @@
         }
     }
 
-    log<level::ERR>("Could not find GPIO base");
+    lg2::error("Could not find GPIO base");
     throw std::runtime_error("Could not find GPIO base!");
 #else
     return 0;
@@ -94,11 +94,9 @@
         result = configGpio(gpioCfg);
         if (result < 0)
         {
-            std::string errorMsg =
-                "Error configuring gpio: GPIO_NUM=" +
-                std::to_string(gpioCfg.number) +
-                ",BUTTON_NAME=" + buttonIFConfig.formFactorName;
-            log<level::ERR>(errorMsg.c_str());
+            lg2::error("{NAME}: Error configuring gpio-{NUM}: {RESULT}", "NAME",
+                       buttonIFConfig.formFactorName, "NUM", gpioCfg.number,
+                       "RESULT", result);
 
             break;
         }
@@ -124,7 +122,7 @@
 
     if (fs::exists(fullPath))
     {
-        log<level::INFO>("GPIO exported", entry("PATH=%s", devPath.c_str()));
+        lg2::info("GPIO exported: {PATH}", "PATH", devPath);
     }
     else
     {
@@ -139,9 +137,8 @@
 
         catch (const std::exception& e)
         {
-            log<level::ERR>("Error in writing!",
-                            entry("PATH=%s", devPath.c_str()),
-                            entry("NUM=%d", gpioNum));
+            lg2::error("{NUM} error in writing {PATH}: {ERROR}", "NUM", gpioNum,
+                       "PATH", devPath, "ERROR", e);
             return -1;
         }
     }
@@ -161,8 +158,8 @@
 
         catch (const std::exception& e)
         {
-            log<level::ERR>("Error in reading!",
-                            entry("PATH=%s", devPath.c_str()));
+            lg2::error("Error in reading {PATH}: {ERROR}", "PATH", devPath,
+                       "ERROR", e);
             return -1;
         }
 
@@ -180,7 +177,7 @@
 
         catch (const std::exception& e)
         {
-            log<level::ERR>("Error in writing!");
+            lg2::error("Error in writing: {ERROR}", "ERROR", e);
             return -1;
         }
     }
@@ -197,7 +194,7 @@
 
         catch (const std::exception& e)
         {
-            log<level::ERR>("Error in writing!");
+            lg2::error("Error in writing: {ERROR}", "ERROR", e);
             return -1;
         }
     }
@@ -218,7 +215,7 @@
 
         catch (const std::exception& e)
         {
-            log<level::ERR>("Error in writing!");
+            lg2::error("Error in writing: {ERROR}", "ERROR", e);
             return -1;
         }
         devPath.clear();
@@ -236,7 +233,7 @@
 
         catch (const std::exception& e)
         {
-            log<level::ERR>("Error in writing!");
+            lg2::error("Error in writing: {ERROR}", "ERROR", e);
             return -1;
         }
     }
@@ -247,7 +244,8 @@
 
     if (fd < 0)
     {
-        log<level::ERR>("open error!");
+        lg2::error("Open {PATH} error: {ERROR}", "PATH", devPath, "ERROR",
+                   errno);
         return -1;
     }
 
diff --git a/src/hostSelector_switch.cpp b/src/hostSelector_switch.cpp
index dbdd836..66b79c8 100644
--- a/src/hostSelector_switch.cpp
+++ b/src/hostSelector_switch.cpp
@@ -1,9 +1,13 @@
 
 #include "hostSelector_switch.hpp"
 
+#include <error.h>
+
+#include <phosphor-logging/lg2.hpp>
+
 // add the button iface class to registry
 static ButtonIFRegister<HostSelector> buttonRegister;
-using namespace phosphor::logging;
+
 size_t HostSelector::getMappedHSConfig(size_t hsPosition)
 {
     size_t adjustedPosition = INVALID_INDEX; // set bmc as default value
@@ -16,9 +20,8 @@
     }
     else
     {
-        log<level::DEBUG>(
-            "getMappedHSConfig : no valid value in map.",
-            entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
+        lg2::debug("getMappedHSConfig : {TYPE}: no valid value in map.", "TYPE",
+                   getFormFactorType());
     }
     return adjustedPosition;
 }
@@ -43,9 +46,8 @@
 
         if (result < 0)
         {
-            log<level::ERR>(
-                "gpio fd lseek error!",
-                entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
+            lg2::error("{TYPE}: Gpio fd lseek error: {ERROR}", "TYPE",
+                       getFormFactorType(), "ERROR", errno);
             throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
                 IOError();
         }
@@ -53,9 +55,8 @@
         result = ::read(config.gpios[index].fd, &buf, sizeof(buf));
         if (result < 0)
         {
-            log<level::ERR>(
-                "gpio fd read error!",
-                entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
+            lg2::error("{TYPE}: Gpio fd read error: {ERROR}", "TYPE",
+                       getFormFactorType(), "ERROR", errno);
             throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
                 IOError();
         }
@@ -104,18 +105,16 @@
 
     if (n < 0)
     {
-        log<level::ERR>(
-            "gpio fd lseek error!",
-            entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
+        lg2::error("{TYPE}: Gpio fd lseek error: {ERROR}", "TYPE",
+                   getFormFactorType(), "ERROR", errno);
         return;
     }
 
     n = ::read(fd, &buf, sizeof(buf));
     if (n < 0)
     {
-        log<level::ERR>(
-            "gpio fd read error!",
-            entry("FORM_FACTOR_TYPE=%s", (getFormFactorType()).c_str()));
+        lg2::error("{TYPE}: Gpio fd read error: {ERROR}", "TYPE",
+                   getFormFactorType(), "ERROR", errno);
         throw sdbusplus::xyz::openbmc_project::Chassis::Common::Error::
             IOError();
     }
diff --git a/src/main.cpp b/src/main.cpp
index 5288635..5b5341d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -23,7 +23,6 @@
 #include <fstream>
 static constexpr auto gpioDefFile = "/etc/default/obmc/gpio/gpio_defs.json";
 
-using namespace phosphor::logging;
 nlohmann::json gpioDefs;
 
 int main(void)
