diff --git a/src/psu/PSUEvent.cpp b/src/psu/PSUEvent.cpp
index 438faa2..353e1f1 100644
--- a/src/psu/PSUEvent.cpp
+++ b/src/psu/PSUEvent.cpp
@@ -31,7 +31,6 @@
 #include <array>
 #include <chrono>
 #include <cstddef>
-#include <iostream>
 #include <memory>
 #include <set>
 #include <stdexcept>
@@ -56,7 +55,7 @@
 
     if (!eventInterface->initialize())
     {
-        std::cerr << "error initializing event interface\n";
+        lg2::error("error initializing event interface");
     }
 
     std::shared_ptr<std::set<std::string>> combineEvent =
@@ -199,7 +198,7 @@
     }
     if (!buffer)
     {
-        std::cerr << "Buffer was invalid?";
+        lg2::error("Buffer was invalid?");
         return;
     }
 
@@ -248,7 +247,7 @@
     }
     if (!buffer)
     {
-        std::cerr << "Buffer was invalid?";
+        lg2::error("Buffer was invalid?");
         return;
     }
     // null terminate the string so we don't walk off the end
@@ -276,7 +275,7 @@
     {
         if (errCount == warnAfterErrorCount)
         {
-            std::cerr << "Failure to read event at " << path << "\n";
+            lg2::error("Failure to read event at '{PATH}'", "PATH", path);
         }
         updateValue(0);
         errCount++;
@@ -324,14 +323,14 @@
                 // Fan Failed has two args
                 if (deassertMessage == "OpenBMC.0.1.PowerSupplyFanRecovered")
                 {
-                    lg2::info("{EVENT} deassert", "EVENT", eventName,
+                    lg2::info("'{EVENT}' deassert", "EVENT", eventName,
                               "REDFISH_MESSAGE_ID", deassertMessage,
                               "REDFISH_MESSAGE_ARGS",
                               (psuName + ',' + fanName));
                 }
                 else
                 {
-                    lg2::info("{EVENT} deassert", "EVENT", eventName,
+                    lg2::info("'{EVENT}' deassert", "EVENT", eventName,
                               "REDFISH_MESSAGE_ID", deassertMessage,
                               "REDFISH_MESSAGE_ARGS", psuName);
                 }
@@ -345,7 +344,7 @@
     }
     else
     {
-        std::cerr << "PSUSubEvent asserted by " << path << "\n";
+        lg2::error("PSUSubEvent asserted by '{PATH}'", "PATH", path);
 
         if ((!*assertState) && ((*asserts).empty()))
         {
@@ -355,14 +354,14 @@
                 // Fan Failed has two args
                 if (assertMessage == "OpenBMC.0.1.PowerSupplyFanFailed")
                 {
-                    lg2::warning("{EVENT} assert", "EVENT", eventName,
+                    lg2::warning("'{EVENT}' assert", "EVENT", eventName,
                                  "REDFISH_MESSAGE_ID", assertMessage,
                                  "REDFISH_MESSAGE_ARGS",
                                  (psuName + ',' + fanName));
                 }
                 else
                 {
-                    lg2::warning("{EVENT} assert", "EVENT", eventName,
+                    lg2::warning("'{EVENT}' assert", "EVENT", eventName,
                                  "REDFISH_MESSAGE_ID", assertMessage,
                                  "REDFISH_MESSAGE_ARGS", psuName);
                 }
diff --git a/src/psu/PSUSensor.cpp b/src/psu/PSUSensor.cpp
index 4d410fe..2ba212e 100644
--- a/src/psu/PSUSensor.cpp
+++ b/src/psu/PSUSensor.cpp
@@ -26,13 +26,13 @@
 #include <boost/asio/error.hpp>
 #include <boost/asio/io_context.hpp>
 #include <boost/asio/random_access_file.hpp>
+#include <phosphor-logging/lg2.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
 #include <array>
 #include <chrono>
 #include <cstddef>
-#include <iostream>
 #include <limits>
 #include <memory>
 #include <stdexcept>
@@ -65,11 +65,13 @@
     std::string unitPath = sensor_paths::getPathForUnits(sensorUnits);
     if constexpr (debug)
     {
-        std::cerr << "Constructed sensor: path " << path << " type "
-                  << objectType << " config " << sensorConfiguration
-                  << " typename " << unitPath << " factor " << factor << " min "
-                  << min << " max " << max << " offset " << offset << " name \""
-                  << sensorName << "\"\n";
+        lg2::debug(
+            "Constructed sensor - path: {PATH}, type: {TYPE}, config: {CONFIG}, "
+            "typename: {TYPENAME}, factor: {FACTOR}, min: {MIN}, max: {MAX}, "
+            "offset: {OFFSET}, name: {NAME}",
+            "PATH", path, "TYPE", objectType, "CONFIG", sensorConfiguration,
+            "TYPENAME", unitPath, "FACTOR", factor, "MIN", min, "MAX", max,
+            "OFFSET", offset, "NAME", sensorName);
     }
     if (pollRate > 0.0)
     {
@@ -159,7 +161,7 @@
 
     if (buffer == nullptr)
     {
-        std::cerr << "Buffer was invalid?";
+        lg2::error("Buffer was invalid?");
         return;
     }
 
@@ -189,7 +191,7 @@
     waitTimer.async_wait([weakRef](const boost::system::error_code& ec) {
         if (ec == boost::asio::error::operation_aborted)
         {
-            std::cerr << "Failed to reschedule\n";
+            lg2::error("Failed to reschedule");
             return;
         }
         std::shared_ptr<PSUSensor> self = weakRef.lock();
@@ -207,20 +209,20 @@
 {
     if (err == boost::asio::error::operation_aborted)
     {
-        std::cerr << "Read aborted\n";
+        lg2::error("Read aborted");
         return;
     }
     if ((err == boost::system::errc::bad_file_descriptor) ||
         (err == boost::asio::error::misc_errors::not_found))
     {
-        std::cerr << "Bad file descriptor for " << path << "\n";
+        lg2::error("Bad file descriptor for '{PATH}'", "PATH", path);
         return;
     }
     if (err || bytesRead == 0)
     {
         if (readingStateGood())
         {
-            std::cerr << name << " read failed\n";
+            lg2::error("'{NAME}' read failed", "NAME", name);
         }
         restartRead();
         return;
@@ -237,7 +239,7 @@
     }
     catch (const std::invalid_argument&)
     {
-        std::cerr << "Could not parse  input from " << path << "\n";
+        lg2::error("Could not parse input from '{PATH}'", "PATH", path);
         incrementError();
     }
 
diff --git a/src/psu/PSUSensorMain.cpp b/src/psu/PSUSensorMain.cpp
index d125470..a02ad17 100644
--- a/src/psu/PSUSensorMain.cpp
+++ b/src/psu/PSUSensorMain.cpp
@@ -31,6 +31,7 @@
 #include <boost/asio/steady_timer.hpp>
 #include <boost/container/flat_map.hpp>
 #include <boost/container/flat_set.hpp>
+#include <phosphor-logging/lg2.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 #include <sdbusplus/bus.hpp>
@@ -50,7 +51,6 @@
 #include <filesystem>
 #include <fstream>
 #include <functional>
-#include <iostream>
 #include <iterator>
 #include <memory>
 #include <regex>
@@ -316,7 +316,7 @@
     findFiles(std::filesystem::path("/sys/class/hwmon"), "name", pmbusPaths);
     if (pmbusPaths.empty())
     {
-        std::cerr << "No PSU sensors in system\n";
+        lg2::error("No PSU sensors in system");
         return;
     }
 
@@ -329,7 +329,7 @@
         std::ifstream nameFile(pmbusPath);
         if (!nameFile.good())
         {
-            std::cerr << "Failure finding pmbus path " << pmbusPath << "\n";
+            lg2::error("Failure finding '{PATH}'", "PATH", pmbusPath);
             continue;
         }
 
@@ -341,8 +341,8 @@
         {
             // To avoid this error message, add your driver name to
             // the pmbusNames vector at the top of this file.
-            std::cerr << "Driver name " << pmbusName
-                      << " not found in sensor whitelist\n";
+            lg2::error("'{NAME}' not found in sensor whitelist", "NAME",
+                       pmbusName);
             continue;
         }
 
@@ -351,7 +351,7 @@
         auto ret = directories.insert(directory.string());
         if (!ret.second)
         {
-            std::cerr << "Duplicate path " << directory.string() << "\n";
+            lg2::error("Duplicate path: '{PATH}'", "PATH", directory);
             continue; // check if path has already been searched
         }
 
@@ -366,7 +366,8 @@
             std::regex_search(devicePath, match, i2cDevRegex);
             if (match.empty())
             {
-                std::cerr << "Found bad device path " << devicePath << "\n";
+                lg2::error("Found bad device path: '{PATH}'", "PATH",
+                           devicePath);
                 continue;
             }
             // Extract <bus>-<address>
@@ -408,8 +409,8 @@
             }
             if (baseConfig == nullptr)
             {
-                std::cerr << "error finding base configuration for "
-                          << deviceName << "\n";
+                lg2::error("error finding base configuration for '{NAME}'",
+                           "NAME", deviceName);
                 continue;
             }
 
@@ -419,7 +420,7 @@
             if (configBus == baseConfig->end() ||
                 configAddress == baseConfig->end())
             {
-                std::cerr << "error finding necessary entry in configuration\n";
+                lg2::error("error finding necessary entry in configuration");
                 continue;
             }
 
@@ -429,8 +430,7 @@
                 std::get_if<uint64_t>(&(configAddress->second));
             if (confBus == nullptr || confAddr == nullptr)
             {
-                std::cerr
-                    << "Cannot get bus or address, invalid configuration\n";
+                lg2::error("Cannot get bus or address, invalid configuration");
                 continue;
             }
 
@@ -438,9 +438,10 @@
             {
                 if constexpr (debug)
                 {
-                    std::cerr << "Configuration skipping " << *confBus << "-"
-                              << *confAddr << " because not " << bus << "-"
-                              << addr << "\n";
+                    lg2::error(
+                        "Configuration skipping '{CONFBUS}'-'{CONFADDR}' because not {BUS}-{ADDR}",
+                        "CONFBUS", *confBus, "CONFADDR", *confAddr, "BUS", bus,
+                        "ADDR", addr);
                 }
                 continue;
             }
@@ -448,7 +449,7 @@
             std::vector<thresholds::Threshold> confThresholds;
             if (!parseThresholdsFromConfig(*sensorData, confThresholds))
             {
-                std::cerr << "error populating total thresholds\n";
+                lg2::error("error populating total thresholds");
             }
             thresholdConfSize = confThresholds.size();
 
@@ -459,7 +460,7 @@
         {
             // To avoid this error message, add your export map entry,
             // from Entity Manager, to sensorTypes at the top of this file.
-            std::cerr << "failed to find match for " << deviceName << "\n";
+            lg2::error("failed to find match for '{NAME}'", "NAME", deviceName);
             continue;
         }
 
@@ -478,15 +479,15 @@
         auto findPSUName = baseConfig->find("Name");
         if (findPSUName == baseConfig->end())
         {
-            std::cerr << "could not determine configuration name for "
-                      << deviceName << "\n";
+            lg2::error("could not determine configuration name for '{NAME}'",
+                       "NAME", deviceName);
             continue;
         }
         const std::string* psuName =
             std::get_if<std::string>(&(findPSUName->second));
         if (psuName == nullptr)
         {
-            std::cerr << "Cannot find psu name, invalid configuration\n";
+            lg2::error("Cannot find psu name, invalid configuration");
             continue;
         }
 
@@ -537,7 +538,7 @@
         if (!findFiles(directory, devParamMap[devType].matchRegEx, sensorPaths,
                        0))
         {
-            std::cerr << "No PSU non-label sensor in PSU\n";
+            lg2::error("No PSU non-label sensor in PSU");
             continue;
         }
 
@@ -546,7 +547,7 @@
         {
             if constexpr (debug)
             {
-                std::cerr << "No max name in PSU \n";
+                lg2::error("No max name in PSU");
             }
         }
 
@@ -581,8 +582,8 @@
             }
             else
             {
-                std::cerr << "Could not extract the alpha prefix from "
-                          << sensorNameStr;
+                lg2::error("Could not extract the alpha prefix from '{NAME}'",
+                           "NAME", sensorNameStr);
                 continue;
             }
 
@@ -618,8 +619,9 @@
                 {
                     if constexpr (debug)
                     {
-                        std::cerr << "Input file " << sensorPath
-                                  << " has no corresponding label file\n";
+                        lg2::error(
+                            "Input file '{PATH}' has no corresponding label file",
+                            "PATH", sensorPath.string());
                     }
                     // hwmon *_input filename with number:
                     // temp1, temp2, temp3, ...
@@ -659,8 +661,8 @@
 
             if constexpr (debug)
             {
-                std::cerr << "Sensor type=\"" << sensorNameSubStr
-                          << "\" label=\"" << labelHead << "\"\n";
+                lg2::error("Sensor type: {NAME}, label: {LABEL}", "NAME",
+                           sensorNameSubStr, "LABEL", labelHead);
             }
 
             if (!findLabels.empty())
@@ -671,8 +673,9 @@
                 {
                     if constexpr (debug)
                     {
-                        std::cerr << "could not find " << labelHead
-                                  << " in the Labels list\n";
+                        lg2::error(
+                            "could not find '{LABEL}' in the Labels list",
+                            "LABEL", labelHead);
                     }
                     continue;
                 }
@@ -687,8 +690,9 @@
             {
                 if constexpr (debug)
                 {
-                    std::cerr << "Could not find matching default property for "
-                              << labelHead << "\n";
+                    lg2::error(
+                        "Could not find matching default property for '{LABEL}'",
+                        "LABEL", labelHead);
                 }
                 continue;
             }
@@ -719,7 +723,7 @@
                 }
                 catch (const std::invalid_argument&)
                 {
-                    std::cerr << "Unable to parse " << keyName << "\n";
+                    lg2::error("Unable to parse '{NAME}'", "NAME", keyName);
                     continue;
                 }
 
@@ -738,7 +742,7 @@
                 }
                 catch (const std::invalid_argument&)
                 {
-                    std::cerr << "Unable to parse " << keyScale << "\n";
+                    lg2::error("Unable to parse '{SCALE}'", "SCALE", keyScale);
                     continue;
                 }
 
@@ -749,7 +753,7 @@
                 }
                 else
                 {
-                    std::cerr << "Unable to accept " << keyScale << "\n";
+                    lg2::error("Unable to accept '{SCALE}'", "SCALE", keyScale);
                     continue;
                 }
             }
@@ -764,7 +768,7 @@
                 }
                 catch (const std::invalid_argument&)
                 {
-                    std::cerr << "Unable to parse " << keyMin << "\n";
+                    lg2::error("Unable to parse '{MIN}'", "MIN", keyMin);
                     continue;
                 }
             }
@@ -779,7 +783,7 @@
                 }
                 catch (const std::invalid_argument&)
                 {
-                    std::cerr << "Unable to parse " << keyMax << "\n";
+                    lg2::error("Unable to parse '{MAX}'", "MAX", keyMax);
                     continue;
                 }
             }
@@ -794,7 +798,8 @@
                 }
                 catch (const std::invalid_argument&)
                 {
-                    std::cerr << "Unable to parse " << keyOffset << "\n";
+                    lg2::error("Unable to parse '{OFFSET}'", "OFFSET",
+                               keyOffset);
                     continue;
                 }
             }
@@ -809,7 +814,7 @@
             }
             if (!(psuProperty.minReading < psuProperty.maxReading))
             {
-                std::cerr << "Min must be less than Max\n";
+                lg2::error("Min must be less than Max");
                 continue;
             }
 
@@ -844,8 +849,8 @@
 
                 if (psuNames.size() <= nameIndex)
                 {
-                    std::cerr << "Could not pair " << labelHead
-                              << " with a Name field\n";
+                    lg2::error("Could not pair '{LABEL}' with a Name field",
+                               "LABEL", labelHead);
                     continue;
                 }
 
@@ -853,9 +858,10 @@
 
                 if constexpr (debug)
                 {
-                    std::cerr << "Sensor label head " << labelHead
-                              << " paired with " << psuNameFromIndex
-                              << " at index " << nameIndex << "\n";
+                    lg2::error(
+                        "'{LABEL}' paired with '{NAME}' at index '{INDEX}'",
+                        "LABEL", labelHead, "NAME", psuNameFromIndex, "INDEX",
+                        nameIndex);
                 }
             }
 
@@ -890,8 +896,9 @@
 
                 if constexpr (debug)
                 {
-                    std::cerr << "Sensor scaling factor " << factor
-                              << " string " << strScaleFactor << "\n";
+                    lg2::error(
+                        "Sensor scaling factor '{FACTOR}' string '{SCALE_FACTOR}'",
+                        "FACTOR", factor, "SCALE_FACTOR", strScaleFactor);
                 }
             }
 
@@ -899,26 +906,27 @@
             if (!parseThresholdsFromConfig(*sensorData, sensorThresholds,
                                            &labelHead))
             {
-                std::cerr << "error populating thresholds for "
-                          << sensorNameSubStr << "\n";
+                lg2::error("error populating thresholds for '{NAME}'", "NAME",
+                           sensorNameSubStr);
             }
 
             auto findSensorUnit = sensorTable.find(sensorNameSubStr);
             if (findSensorUnit == sensorTable.end())
             {
-                std::cerr << sensorNameSubStr
-                          << " is not a recognized sensor type\n";
+                lg2::error("'{NAME}' is not a recognized sensor type", "NAME",
+                           sensorNameSubStr);
                 continue;
             }
 
             if constexpr (debug)
             {
-                std::cerr << "Sensor properties: Name \""
-                          << psuProperty.labelTypeName << "\" Scale "
-                          << psuProperty.sensorScaleFactor << " Min "
-                          << psuProperty.minReading << " Max "
-                          << psuProperty.maxReading << " Offset "
-                          << psuProperty.sensorOffset << "\n";
+                lg2::error("Sensor properties - Name: {NAME}, Scale: {SCALE}, "
+                           "Min: {MIN}, Max: {MAX}, Offset: {OFFSET}",
+                           "NAME", psuProperty.labelTypeName, "SCALE",
+                           psuProperty.sensorScaleFactor, "MIN",
+                           psuProperty.minReading, "MAX",
+                           psuProperty.maxReading, "OFFSET",
+                           psuProperty.sensorOffset);
             }
 
             std::string sensorName = psuProperty.labelTypeName;
@@ -928,7 +936,7 @@
                 {
                     // Allow selective disabling of an individual sensor,
                     // by customizing its name to an empty string.
-                    std::cerr << "Sensor disabled, empty string\n";
+                    lg2::error("Sensor disabled, empty string");
                     continue;
                 }
             }
@@ -948,9 +956,9 @@
 
             if constexpr (debug)
             {
-                std::cerr << "Sensor name \"" << sensorName << "\" path \""
-                          << sensorPathStr << "\" type \"" << sensorType
-                          << "\"\n";
+                lg2::error("Sensor name: {NAME}, path: {PATH}, type: {TYPE}",
+                           "NAME", sensorName, "PATH", sensorPathStr, "TYPE",
+                           sensorType);
             }
             // destruct existing one first if already created
 
@@ -977,8 +985,8 @@
                 ++numCreated;
                 if constexpr (debug)
                 {
-                    std::cerr
-                        << "Created " << numCreated << " sensors so far\n";
+                    lg2::error("Created '{NUM}' sensors so far", "NUM",
+                               numCreated);
                 }
             }
         }
@@ -997,7 +1005,7 @@
 
     if constexpr (debug)
     {
-        std::cerr << "Created total of " << numCreated << " sensors\n";
+        lg2::error("Created total of '{NUM}' sensors", "NUM", numCreated);
     }
 }
 
@@ -1020,8 +1028,7 @@
     }
     catch (sdbusplus::exception_t& e)
     {
-        std::cerr << "error getting inventory item subtree: " << e.what()
-                  << "\n";
+        lg2::error("error getting inventory item subtree: '{ERR}'", "ERR", e);
         return;
     }
 
@@ -1048,7 +1055,7 @@
         }
         catch (sdbusplus::exception_t& e)
         {
-            std::cerr << "Error in getting CPU presence: " << e.what() << "\n";
+            lg2::error("Error in getting CPU presence: '{ERR}'", "ERR", e);
             continue;
         }
 
@@ -1062,7 +1069,7 @@
             }
             catch (const std::exception& e)
             {
-                std::cerr << "Error converting CPU index, " << e.what() << '\n';
+                lg2::error("Error converting CPU index: '{ERR}'", "ERR", e);
                 continue;
             }
             cpuPresence[cpuIndex] = *present;
@@ -1186,7 +1193,7 @@
         [&](sdbusplus::message_t& message) {
             if (message.is_method_error())
             {
-                std::cerr << "callback method error\n";
+                lg2::error("callback method error");
                 return;
             }
             sensorsChanged->insert(message.get_path());
@@ -1198,7 +1205,7 @@
                 }
                 if (ec)
                 {
-                    std::cerr << "timer error\n";
+                    lg2::error("timer error");
                 }
                 createSensors(io, objectServer, systemBus, sensorsChanged,
                               false);
@@ -1224,7 +1231,7 @@
             }
             catch (const std::invalid_argument&)
             {
-                std::cerr << "Found invalid path " << path << "\n";
+                lg2::error("Found invalid path: '{PATH}'", "PATH", path);
                 return;
             }
 
@@ -1257,7 +1264,7 @@
                 }
                 if (ec)
                 {
-                    std::cerr << "timer error\n";
+                    lg2::error("timer error");
                     return;
                 }
                 createSensors(io, objectServer, systemBus, nullptr, false);
