diff --git a/src/entity_manager/configuration.cpp b/src/entity_manager/configuration.cpp
index 1e4ceac..b6ece2b 100644
--- a/src/entity_manager/configuration.cpp
+++ b/src/entity_manager/configuration.cpp
@@ -1,10 +1,10 @@
 #include "configuration.hpp"
 
 #include "perform_probe.hpp"
-#include "phosphor-logging/lg2.hpp"
 #include "utils.hpp"
 
 #include <nlohmann/json.hpp>
+#include <phosphor-logging/lg2.hpp>
 #include <valijson/adapters/nlohmann_json_adapter.hpp>
 #include <valijson/schema.hpp>
 #include <valijson/schema_parser.hpp>
@@ -12,7 +12,6 @@
 
 #include <filesystem>
 #include <fstream>
-#include <iostream>
 #include <string>
 #include <vector>
 
@@ -33,8 +32,8 @@
                                                hostConfigurationDirectory},
             R"(.*\.json)", jsonPaths))
     {
-        std::cerr << "Unable to find any configuration files in "
-                  << configurationDirectory << "\n";
+        lg2::error("Unable to find any configuration files in {DIR}", "DIR",
+                   configurationDirectory);
         return;
     }
 
@@ -42,8 +41,7 @@
         std::string(schemaDirectory) + "/" + globalSchema);
     if (!schemaStream.good())
     {
-        std::cerr
-            << "Cannot open schema file,  cannot validate JSON, exiting\n\n";
+        lg2::error("Cannot open schema file,  cannot validate JSON, exiting");
         std::exit(EXIT_FAILURE);
         return;
     }
@@ -51,8 +49,8 @@
         nlohmann::json::parse(schemaStream, nullptr, false, true);
     if (schema.is_discarded())
     {
-        std::cerr
-            << "Illegal schema file detected, cannot validate JSON, exiting\n";
+        lg2::error(
+            "Illegal schema file detected, cannot validate JSON, exiting");
         std::exit(EXIT_FAILURE);
         return;
     }
@@ -62,19 +60,19 @@
         std::ifstream jsonStream(jsonPath.c_str());
         if (!jsonStream.good())
         {
-            std::cerr << "unable to open " << jsonPath.string() << "\n";
+            lg2::error("unable to open {PATH}", "PATH", jsonPath.string());
             continue;
         }
         auto data = nlohmann::json::parse(jsonStream, nullptr, false, true);
         if (data.is_discarded())
         {
-            std::cerr << "syntax error in " << jsonPath.string() << "\n";
+            lg2::error("syntax error in {PATH}", "PATH", jsonPath.string());
             continue;
         }
 
         if (ENABLE_RUNTIME_VALIDATE_JSON && !validateJson(schema, data))
         {
-            std::cerr << "Error validating " << jsonPath.string() << "\n";
+            lg2::error("Error validating {PATH}", "PATH", jsonPath.string());
             continue;
         }
 
@@ -137,7 +135,8 @@
         auto findProbe = it->find("Probe");
         if (findProbe == it->end())
         {
-            std::cerr << "configuration file missing probe:\n " << *it << "\n";
+            lg2::error("configuration file missing probe: {PROBE}", "PROBE",
+                       *it);
             it++;
             continue;
         }
@@ -158,7 +157,7 @@
             const std::string* probe = probeJson.get_ptr<const std::string*>();
             if (probe == nullptr)
             {
-                std::cerr << "Probe statement wasn't a string, can't parse";
+                lg2::error("Probe statement wasn't a string, can't parse");
                 continue;
             }
             // Skip it if the probe cmd doesn't contain an interface.
diff --git a/src/entity_manager/dbus_interface.cpp b/src/entity_manager/dbus_interface.cpp
index 1492314..461b27c 100644
--- a/src/entity_manager/dbus_interface.cpp
+++ b/src/entity_manager/dbus_interface.cpp
@@ -5,6 +5,7 @@
 
 #include <boost/algorithm/string/case_conv.hpp>
 #include <boost/container/flat_map.hpp>
+#include <phosphor-logging/lg2.hpp>
 
 #include <fstream>
 #include <regex>
@@ -35,10 +36,10 @@
     }
     catch (std::exception& e)
     {
-        std::cerr << "Unable to initialize dbus interface : " << e.what()
-                  << "\n"
-                  << "object Path : " << iface->get_object_path() << "\n"
-                  << "interface name : " << iface->get_interface_name() << "\n";
+        lg2::error(
+            "Unable to initialize dbus interface : {ERR} object Path : {PATH} interface name : {INTF}",
+            "ERR", e, "PATH", iface->get_object_path(), "INTF",
+            iface->get_interface_name());
     }
 }
 
@@ -95,7 +96,7 @@
 
             if (!writeJsonFiles(systemConfiguration))
             {
-                std::cerr << "error setting json file\n";
+                lg2::error("error setting json file");
                 throw DBusInternalError();
             }
         });
@@ -190,8 +191,9 @@
         }
         default:
         {
-            std::cerr << "Unexpected json type in system configuration " << key
-                      << ": " << value.type_name() << "\n";
+            lg2::error(
+                "Unexpected json type in system configuration {KEY}: {VALUE}",
+                "KEY", key, "VALUE", value.type_name());
             break;
         }
     }
@@ -215,7 +217,7 @@
             type = value[0].type();
             if (!checkArrayElementsSameType(value))
             {
-                std::cerr << "dbus format error" << value << "\n";
+                lg2::error("dbus format error {VALUE}", "VALUE", value);
                 continue;
             }
         }
@@ -326,7 +328,7 @@
                     nlohmann::json::parse(schemaFile, nullptr, false, true);
                 if (schema.is_discarded())
                 {
-                    std::cerr << "Schema not legal" << *type << ".json\n";
+                    lg2::error("Schema not legal: {TYPE}.json", "TYPE", *type);
                     throw DBusInternalError();
                 }
 
@@ -346,7 +348,7 @@
             }
             if (!writeJsonFiles(systemConfiguration))
             {
-                std::cerr << "Error writing json files\n";
+                lg2::error("Error writing json files");
             }
             std::string dbusName = *name;
 
diff --git a/src/entity_manager/dbus_interface.hpp b/src/entity_manager/dbus_interface.hpp
index 9bf223f..9c20d8f 100644
--- a/src/entity_manager/dbus_interface.hpp
+++ b/src/entity_manager/dbus_interface.hpp
@@ -4,10 +4,10 @@
 
 #include <boost/container/flat_map.hpp>
 #include <nlohmann/json.hpp>
+#include <phosphor-logging/lg2.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
-#include <iostream>
 #include <vector>
 
 namespace dbus_interface
@@ -89,12 +89,12 @@
                 if (!setJsonFromPointer(jsonPointerString, val,
                                         systemConfiguration))
                 {
-                    std::cerr << "error setting json field\n";
+                    lg2::error("error setting json field");
                     return -1;
                 }
                 if (!writeJsonFiles(systemConfiguration))
                 {
-                    std::cerr << "error setting json file\n";
+                    lg2::error("error setting json file");
                     return -1;
                 }
                 return 1;
@@ -123,12 +123,12 @@
             if (!setJsonFromPointer(jsonPointerString, val,
                                     systemConfiguration))
             {
-                std::cerr << "error setting json field\n";
+                lg2::error("error setting json field");
                 return -1;
             }
             if (!writeJsonFiles(systemConfiguration))
             {
-                std::cerr << "error setting json file\n";
+                lg2::error("error setting json file");
                 return -1;
             }
             return 1;
diff --git a/src/entity_manager/entity_manager.cpp b/src/entity_manager/entity_manager.cpp
index 22f9a6a..ef4212a 100644
--- a/src/entity_manager/entity_manager.cpp
+++ b/src/entity_manager/entity_manager.cpp
@@ -10,7 +10,6 @@
 #include "log_device_inventory.hpp"
 #include "overlay.hpp"
 #include "perform_scan.hpp"
-#include "phosphor-logging/lg2.hpp"
 #include "topology.hpp"
 #include "utils.hpp"
 
@@ -25,13 +24,13 @@
 #include <boost/container/flat_set.hpp>
 #include <boost/range/iterator_range.hpp>
 #include <nlohmann/json.hpp>
+#include <phosphor-logging/lg2.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
 #include <filesystem>
 #include <fstream>
 #include <functional>
-#include <iostream>
 #include <map>
 #include <regex>
 constexpr const char* tempConfigDir = "/tmp/configuration/";
@@ -126,8 +125,8 @@
     }
     else
     {
-        std::cerr << "Unable to find type for " << boardName
-                  << " reverting to Chassis.\n";
+        lg2::error("Unable to find type for {BOARD} reverting to Chassis.",
+                   "BOARD", boardName);
         boardType = "Chassis";
     }
 
@@ -198,7 +197,7 @@
     auto findName = item.find("Name");
     if (findName == item.end())
     {
-        std::cerr << "cannot find name in field " << item << "\n";
+        lg2::error("cannot find name in field {ITEM}", "ITEM", item);
         return;
     }
     auto findStatus = item.find("Status");
@@ -318,7 +317,7 @@
         }
         if (!isLegal)
         {
-            std::cerr << "dbus format error" << config << "\n";
+            lg2::error("dbus format error {JSON}", "JSON", config);
             return false;
         }
 
@@ -458,7 +457,7 @@
     boost::asio::post(io, [this]() {
         if (!writeJsonFiles(systemConfiguration))
         {
-            std::cerr << "Error writing json files\n";
+            lg2::error("Error writing json files");
         }
     });
 
@@ -489,7 +488,7 @@
             }
             if (ec)
             {
-                std::cerr << "async wait error " << ec << "\n";
+                lg2::error("async wait error {ERR}", "ERR", ec.message());
                 return;
             }
 
@@ -582,8 +581,8 @@
                 auto data = nlohmann::json::parse(jsonStream, nullptr, false);
                 if (data.is_discarded())
                 {
-                    std::cerr
-                        << "syntax error in " << lastConfiguration << "\n";
+                    lg2::error("syntax error in {PATH}", "PATH",
+                               lastConfiguration);
                 }
                 else
                 {
@@ -592,7 +591,7 @@
             }
             else
             {
-                std::cerr << "unable to open " << lastConfiguration << "\n";
+                lg2::error("unable to open {PATH}", "PATH", lastConfiguration);
             }
         }
     }
@@ -600,7 +599,7 @@
     {
         // not an error, just logging at this level to make it in the journal
         std::error_code ec;
-        std::cerr << "Clearing previous configuration\n";
+        lg2::error("Clearing previous configuration");
         std::filesystem::remove(currentConfiguration, ec);
     }
 }
diff --git a/src/entity_manager/expression.cpp b/src/entity_manager/expression.cpp
index 9b878c8..70c01ad 100644
--- a/src/entity_manager/expression.cpp
+++ b/src/entity_manager/expression.cpp
@@ -3,7 +3,8 @@
 
 #include "expression.hpp"
 
-#include <iostream>
+#include <phosphor-logging/lg2.hpp>
+
 #include <stdexcept>
 
 namespace expression
@@ -99,8 +100,8 @@
             }
             catch (const std::invalid_argument&)
             {
-                std::cerr << "Parameter not supported for templates " << *curr
-                          << "\n";
+                lg2::error("Parameter not supported for templates {STR}", "STR",
+                           *curr);
                 continue;
             }
         }
diff --git a/src/entity_manager/overlay.cpp b/src/entity_manager/overlay.cpp
index 635a5b8..534c68f 100644
--- a/src/entity_manager/overlay.cpp
+++ b/src/entity_manager/overlay.cpp
@@ -17,7 +17,6 @@
 #include <filesystem>
 #include <fstream>
 #include <iomanip>
-#include <iostream>
 #include <regex>
 #include <string>
 
@@ -81,8 +80,8 @@
             devDir / ("channel-" + std::to_string(channelIndex));
         if (!is_symlink(channelPath))
         {
-            std::cerr << channelPath << " for mux channel " << channelName
-                      << " doesn't exist!\n";
+            lg2::error("{PATH} for mux channel {CHANNEL} doesn't exist!",
+                       "PATH", channelPath.string(), "CHANNEL", channelName);
             continue;
         }
         std::filesystem::path bus = std::filesystem::read_symlink(channelPath);
@@ -93,8 +92,8 @@
         std::filesystem::create_symlink(fp, link, ec);
         if (ec)
         {
-            std::cerr << "Failure creating symlink for " << fp << " to " << link
-                      << "\n";
+            lg2::error("Failure creating symlink for {PATH} to {LINK}", "PATH",
+                       fp.string(), "LINK", link.string());
         }
     }
 }
@@ -107,7 +106,7 @@
     std::ofstream deviceFile(deviceDestructor);
     if (!deviceFile.good())
     {
-        std::cerr << "Error writing " << deviceDestructor << "\n";
+        lg2::error("Error writing {PATH}", "PATH", deviceDestructor.string());
         return -1;
     }
     deviceFile << std::to_string(address);
@@ -124,7 +123,7 @@
     std::ofstream deviceFile(deviceConstructor);
     if (!deviceFile.good())
     {
-        std::cerr << "Error writing " << deviceConstructor << "\n";
+        lg2::error("Error writing {PATH}", "PATH", deviceConstructor.string());
         return -1;
     }
     deviceFile << parameters;
@@ -183,7 +182,7 @@
                  &io](const boost::system::error_code& ec) mutable {
                     if (ec)
                     {
-                        std::cerr << "Timer error: " << ec << "\n";
+                        lg2::error("Timer error: {ERR}", "ERR", ec.message());
                         return -2;
                     }
                     return buildDevice(name, busPath, parameters, bus, address,
diff --git a/src/entity_manager/perform_probe.cpp b/src/entity_manager/perform_probe.cpp
index 50943c7..f398860 100644
--- a/src/entity_manager/perform_probe.cpp
+++ b/src/entity_manager/perform_probe.cpp
@@ -8,7 +8,6 @@
 #include <boost/algorithm/string/replace.hpp>
 #include <phosphor-logging/lg2.hpp>
 
-#include <iostream>
 #include <regex>
 #include <utility>
 
@@ -110,8 +109,8 @@
                 {
                     if (!std::regex_search(probe, match, command))
                     {
-                        std::cerr
-                            << "found probe syntax error " << probe << "\n";
+                        lg2::error("found probe syntax error {JSON}", "JSON",
+                                   probe);
                         return false;
                     }
                     std::string commandStr = *(match.begin() + 1);
@@ -132,7 +131,7 @@
         {
             if (!std::regex_search(probe, match, command))
             {
-                std::cerr << "dbus probe syntax error " << probe << "\n";
+                lg2::error("dbus probe syntax error {JSON}", "JSON", probe);
                 return false;
             }
             std::string commandStr = *(match.begin() + 1);
@@ -142,7 +141,8 @@
             auto json = nlohmann::json::parse(commandStr, nullptr, false, true);
             if (json.is_discarded())
             {
-                std::cerr << "dbus command syntax error " << commandStr << "\n";
+                lg2::error("dbus command syntax error {STR}", "STR",
+                           commandStr);
                 return false;
             }
             // we can match any (string, variant) property. (string, string)
diff --git a/src/entity_manager/perform_scan.cpp b/src/entity_manager/perform_scan.cpp
index c71fa48..4a3696f 100644
--- a/src/entity_manager/perform_scan.cpp
+++ b/src/entity_manager/perform_scan.cpp
@@ -12,7 +12,6 @@
 #include <phosphor-logging/lg2.hpp>
 
 #include <charconv>
-#include <iostream>
 
 using GetSubTreeType = std::vector<
     std::pair<std::string,
@@ -35,8 +34,9 @@
 {
     if (retries == 0U)
     {
-        std::cerr << "retries exhausted on " << instance.busName << " "
-                  << instance.path << " " << instance.interface << "\n";
+        lg2::error("retries exhausted on {BUSNAME} {PATH} {INTF}", "BUSNAME",
+                   instance.busName, "PATH", instance.path, "INTF",
+                   instance.interface);
         return;
     }
 
@@ -45,9 +45,9 @@
          &io](boost::system::error_code& errc, const DBusInterface& resp) {
             if (errc)
             {
-                std::cerr << "error calling getall on  " << instance.busName
-                          << " " << instance.path << " "
-                          << instance.interface << "\n";
+                lg2::error("error calling getall on {BUSNAME} {PATH} {INTF}",
+                           "BUSNAME", instance.busName, "PATH", instance.path,
+                           "INTF", instance.interface);
 
                 auto timer = std::make_shared<boost::asio::steady_timer>(io);
                 timer->expires_after(std::chrono::seconds(2));
@@ -125,7 +125,7 @@
                 {
                     return; // wasn't found by mapper
                 }
-                std::cerr << "Error communicating to mapper.\n";
+                lg2::error("Error communicating to mapper.");
 
                 if (retries == 0U)
                 {
@@ -220,7 +220,7 @@
     auto nameIt = record.find("Name");
     if (nameIt == record.end())
     {
-        std::cerr << "Last JSON Illegal\n";
+        lg2::error("Last JSON Illegal");
         return;
     }
 
@@ -258,7 +258,7 @@
         {
             if (!value.is_string())
             {
-                std::cerr << "Value is invalid type " << value << "\n";
+                lg2::error("Value is invalid type {VALUE}", "VALUE", value);
                 break;
             }
             matches.emplace_back(value);
@@ -267,7 +267,7 @@
         return true;
     }
 
-    std::cerr << "Value is invalid type " << keyPair.key() << "\n";
+    lg2::error("Value is invalid type {KEY}", "KEY", keyPair.key());
 
     return false;
 }
@@ -369,8 +369,9 @@
 
     if (!matches.empty())
     {
-        std::cerr << "configuration file dependency error, could not find "
-                  << keyPair.key() << " " << keyPair.value() << "\n";
+        lg2::error(
+            "configuration file dependency error, could not find {KEY} {VALUE}",
+            "KEY", keyPair.key(), "VALUE", keyPair.value());
     }
 }
 
@@ -398,9 +399,9 @@
 
     if (replaceStr)
     {
-        std::cerr << "Duplicates found, replacing " << *replaceStr
-                  << " with found device index.\n Consider "
-                     "fixing template to not have duplicates\n";
+        lg2::error(
+            "Duplicates found, replacing {STR} with found device index. Consider fixing template to not have duplicates",
+            "STR", *replaceStr);
     }
 
     return copyIt.value();
@@ -473,7 +474,7 @@
         auto getName = record.find("Name");
         if (getName == record.end())
         {
-            std::cerr << "Record Missing Name! " << record.dump();
+            lg2::error("Record Missing Name! {JSON}", "JSON", record.dump());
             continue; // this should be impossible at this level
         }
 
@@ -532,7 +533,8 @@
         auto findProbe = it->find("Probe");
         if (findProbe == it->end())
         {
-            std::cerr << "configuration file missing probe:\n " << *it << "\n";
+            lg2::error("configuration file missing probe:\n {JSON}", "JSON",
+                       *it);
             it = _configurations.erase(it);
             continue;
         }
@@ -540,7 +542,8 @@
         auto findName = it->find("Name");
         if (findName == it->end())
         {
-            std::cerr << "configuration file missing name:\n " << *it << "\n";
+            lg2::error("configuration file missing name:\n {JSON}", "JSON",
+                       *it);
             it = _configurations.erase(it);
             continue;
         }
@@ -578,7 +581,7 @@
             const std::string* probe = probeJson.get_ptr<const std::string*>();
             if (probe == nullptr)
             {
-                std::cerr << "Probe statement wasn't a string, can't parse";
+                lg2::error("Probe statement wasn't a string, can't parse");
                 continue;
             }
             if (probe::findProbeType(*probe))
diff --git a/src/entity_manager/utils.cpp b/src/entity_manager/utils.cpp
index 28e6d11..14b4f98 100644
--- a/src/entity_manager/utils.cpp
+++ b/src/entity_manager/utils.cpp
@@ -14,7 +14,6 @@
 #include <sdbusplus/bus/match.hpp>
 
 #include <fstream>
-#include <iostream>
 #include <regex>
 
 const std::regex illegalDbusMemberRegex("[^A-Za-z0-9_]");
@@ -225,13 +224,13 @@
         // need at least 1 operation and number
         if (split.size() < 2)
         {
-            std::cerr << "Syntax error on template replacement of " << *strPtr
-                      << "\n";
+            lg2::error("Syntax error on template replacement of {STR}", "STR",
+                       *strPtr);
             for (const std::string& data : split)
             {
-                std::cerr << data << " ";
+                lg2::error("{SPLIT} ", "SPLIT", data);
             }
-            std::cerr << "\n";
+            lg2::error("");
             continue;
         }
 
