diff --git a/src/fru_device/fru_utils.cpp b/src/fru_device/fru_utils.cpp
index 4b01719..385ea72 100644
--- a/src/fru_device/fru_utils.cpp
+++ b/src/fru_device/fru_utils.cpp
@@ -10,7 +10,6 @@
 #include <cstdint>
 #include <filesystem>
 #include <iomanip>
-#include <iostream>
 #include <numeric>
 #include <set>
 #include <sstream>
@@ -95,7 +94,7 @@
     /* we need at least one byte to decode the type/len header */
     if (iter == end)
     {
-        std::cerr << "Truncated FRU data\n";
+        lg2::error("Truncated FRU data");
         return make_pair(DecodeState::err, value);
     }
 
@@ -114,7 +113,7 @@
     /* we should have at least len bytes of data available overall */
     if (iter + len > end)
     {
-        std::cerr << "FRU data field extends past end of FRU area data\n";
+        lg2::error("FRU data field extends past end of FRU area data");
         return make_pair(DecodeState::err, value);
     }
 
@@ -143,7 +142,7 @@
              */
             if (!isLangEng)
             {
-                std::cerr << "Error: Non english string is not supported \n";
+                lg2::error("Error: Non english string is not supported ");
                 return make_pair(DecodeState::err, value);
             }
 
@@ -193,8 +192,7 @@
     // but we don't support that.
     if ((lang != 0U) && lang != 25)
     {
-        std::cerr << "Warning: languages other than English is not "
-                     "supported\n";
+        lg2::error("Warning: languages other than English is not supported");
         // Return language flag as non english
         return false;
     }
@@ -218,21 +216,21 @@
     // check if Fru data has at least 8 byte header
     if (fruBytesSize <= fruBlockSize)
     {
-        std::cerr << "Error: trying to parse empty FRU\n";
+        lg2::error("Error: trying to parse empty FRU");
         return false;
     }
 
     // Check range of passed currentArea value
     if (currentArea > fruAreas::fruAreaMultirecord)
     {
-        std::cerr << "Error: Fru area is out of range\n";
+        lg2::error("Error: Fru area is out of range");
         return false;
     }
 
     unsigned int currentAreaIndex = getHeaderAreaFieldOffset(currentArea);
     if (currentAreaIndex > fruBytesSize)
     {
-        std::cerr << "Error: Fru area index is out of range\n";
+        lg2::error("Error: Fru area index is out of range");
         return false;
     }
 
@@ -252,7 +250,7 @@
         unsigned int areaIndex = getHeaderAreaFieldOffset(area);
         if (areaIndex > fruBytesSize)
         {
-            std::cerr << "Error: Fru area index is out of range\n";
+            lg2::error("Error: Fru area index is out of range");
             return false;
         }
 
@@ -266,9 +264,9 @@
         // check for overlapping of current offset with given areaoffset
         if (areaOffset == start || (areaOffset > start && areaOffset < end))
         {
-            std::cerr << getFruAreaName(currentArea)
-                      << " offset is overlapping with " << getFruAreaName(area)
-                      << " offset\n";
+            lg2::error("{AREA1} offset is overlapping with {AREA2} offset",
+                       "AREA1", getFruAreaName(currentArea), "AREA2",
+                       getFruAreaName(area));
             return false;
         }
     }
@@ -406,13 +404,13 @@
     }
     else if (state == DecodeState::err)
     {
-        std::cerr << "Error while parsing " << name << "\n";
+        lg2::error("Error while parsing {NAME}", "NAME", name);
 
         // Cancel decoding if failed to parse any of mandatory
         // fields
         if (fieldIndex < fruAreaFieldNames.size())
         {
-            std::cerr << "Failed to parse mandatory field \n";
+            lg2::error("Failed to parse mandatory field ");
             return resCodes::resErr;
         }
         return resCodes::resWarn;
@@ -421,8 +419,9 @@
     {
         if (fieldIndex < fruAreaFieldNames.size())
         {
-            std::cerr << "Mandatory fields absent in FRU area "
-                      << getFruAreaName(area) << " after " << name << "\n";
+            lg2::error(
+                "Mandatory fields absent in FRU area {AREA} after {NAME}",
+                "AREA", getFruAreaName(area), "NAME", name);
             return resCodes::resWarn;
         }
     }
@@ -436,7 +435,7 @@
     resCodes ret = resCodes::resOK;
     if (fruBytes.size() <= fruBlockSize)
     {
-        std::cerr << "Error: trying to parse empty FRU \n";
+        lg2::error("Error: trying to parse empty FRU ");
         return resCodes::resErr;
     }
     result["Common_Format_Version"] =
@@ -458,13 +457,14 @@
             fruBytes.begin() + offset;
         if (fruBytesIter + fruBlockSize >= fruBytes.end())
         {
-            std::cerr << "Not enough data to parse \n";
+            lg2::error("Not enough data to parse ");
             return resCodes::resErr;
         }
         // check for format version 1
         if (*fruBytesIter != 0x01)
         {
-            std::cerr << "Unexpected version " << *fruBytesIter << "\n";
+            lg2::error("Unexpected version {VERSION}", "VERSION",
+                       *fruBytesIter);
             return resCodes::resErr;
         }
         ++fruBytesIter;
@@ -493,7 +493,7 @@
                << static_cast<int>(fruComputedChecksum) << "\n";
             ss << "\tThe read checksum: 0x" << std::setw(2)
                << static_cast<int>(*fruBytesIterEndArea) << "\n";
-            std::cerr << ss.str();
+            lg2::error("{ERR}", "ERR", ss.str());
             ret = resCodes::resWarn;
         }
 
@@ -534,7 +534,7 @@
                                            "%Y%m%dT%H%M%SZ", &fruTime);
                 if (bytes == 0)
                 {
-                    std::cerr << "invalid time string encountered\n";
+                    lg2::error("invalid time string encountered");
                     return resCodes::resErr;
                 }
 
@@ -556,8 +556,9 @@
             }
             default:
             {
-                std::cerr << "Internal error: unexpected FRU area index: "
-                          << static_cast<int>(area) << " \n";
+                lg2::error(
+                    "Internal error: unexpected FRU area index: {INDEX} ",
+                    "INDEX", static_cast<int>(area));
                 return resCodes::resErr;
             }
         }
@@ -582,8 +583,8 @@
             uint8_t c = *fruBytesIter;
             if (c != 0U)
             {
-                std::cerr << "Non-zero byte after EndOfFields in FRU area "
-                          << getFruAreaName(area) << "\n";
+                lg2::error("Non-zero byte after EndOfFields in FRU area {AREA}",
+                           "AREA", getFruAreaName(area));
                 ret = resCodes::resWarn;
                 break;
             }
@@ -722,8 +723,8 @@
 {
     if (reader.read(baseOffset, 0x8, blockData.data()) < 0)
     {
-        std::cerr << "failed to read " << errorHelp << " base offset "
-                  << baseOffset << "\n";
+        lg2::error("failed to read {ERR} base offset {OFFSET}", "ERR",
+                   errorHelp, "OFFSET", baseOffset);
         return false;
     }
 
@@ -804,8 +805,8 @@
          */
         if (areaOffset <= prevOffset)
         {
-            std::cerr << "Fru area offsets are not in required order as per "
-                         "Section 17 of Fru specification\n";
+            lg2::error(
+                "Fru area offsets are not in required order as per Section 17 of Fru specification");
             return {{}, true};
         }
         prevOffset = areaOffset;
@@ -822,8 +823,8 @@
 
         if (reader.read(baseOffset + areaOffset, 0x2, blockData.data()) < 0)
         {
-            std::cerr << "failed to read " << errorHelp << " base offset "
-                      << baseOffset << "\n";
+            lg2::error("failed to read {ERR} base offset {OFFSET}", "ERR",
+                       errorHelp, "OFFSET", baseOffset);
             return {{}, true};
         }
 
@@ -852,8 +853,8 @@
             // record has 3 bytes of the header we care about.
             if (reader.read(baseOffset + areaOffset, 0x3, blockData.data()) < 0)
             {
-                std::cerr << "failed to read " << errorHelp << " base offset "
-                          << baseOffset << "\n";
+                lg2::error("failed to read {STR} base offset {OFFSET}", "STR",
+                           errorHelp, "OFFSET", baseOffset);
                 return {{}, true};
             }
 
@@ -884,8 +885,8 @@
         if (reader.read(baseOffset + readOffset, requestLength,
                         blockData.data()) < 0)
         {
-            std::cerr << "failed to read " << errorHelp << " base offset "
-                      << baseOffset << "\n";
+            lg2::error("failed to read {ERR} base offset {OFFSET}", "ERR",
+                       errorHelp, "OFFSET", baseOffset);
             return {{}, true};
         }
 
@@ -1383,8 +1384,8 @@
     auto it = std::find(fruAreaNames.begin(), fruAreaNames.end(), areaName);
     if (it == fruAreaNames.end())
     {
-        std::cerr << "Can't parse area name for property " << propertyName
-                  << " \n";
+        lg2::error("Can't parse area name for property {PROP} ", "PROP",
+                   propertyName);
         return false;
     }
     fruAreas fruAreaToUpdate = static_cast<fruAreas>(it - fruAreaNames.begin());
@@ -1407,12 +1408,12 @@
             fruAreaFieldNames = &productFruAreas;
             break;
         default:
-            std::cerr << "Invalid PropertyName " << propertyName << " \n";
+            lg2::error("Invalid PropertyName {PROP}", "PROP", propertyName);
             return false;
     }
     if (fruAreaOffsetFieldValue == 0)
     {
-        std::cerr << "FRU Area for " << propertyName << " not present \n";
+        lg2::error("FRU Area for {PROP} not present ", "PROP", propertyName);
         return false;
     }
 
@@ -1438,8 +1439,8 @@
         std::size_t pos = propertyName.find(fruCustomFieldName);
         if (pos == std::string::npos)
         {
-            std::cerr << "PropertyName doesn't exist in FRU Area Vectors: "
-                      << propertyName << "\n";
+            lg2::error("PropertyName doesn't exist in FRU Area Vectors: {PROP}",
+                       "PROP", propertyName);
             return false;
         }
         std::string fieldNumStr =
@@ -1447,8 +1448,8 @@
         size_t fieldNum = std::stoi(fieldNumStr);
         if (fieldNum == 0)
         {
-            std::cerr << "PropertyName not recognized: " << propertyName
-                      << "\n";
+            lg2::error("PropertyName not recognized: {PROP}", "PROP",
+                       propertyName);
             return false;
         }
         skipToFRUUpdateField += fieldNum;
@@ -1488,7 +1489,7 @@
     ssize_t fieldLength = getFieldLength(fruData[fieldLoc]);
     if (fieldLength < 0)
     {
-        std::cerr << "Property " << propertyName << " not present \n";
+        lg2::error("Property {PROP} not present ", "PROP", propertyName);
         return false;
     }
 
@@ -1580,14 +1581,15 @@
     resCodes res = formatIPMIFRU(device, formattedFRU);
     if (res == resCodes::resErr)
     {
-        std::cerr << "failed to parse FRU for device at bus " << bus
-                  << " address " << address << "\n";
+        lg2::error("failed to parse FRU for device at bus {BUS} address {ADDR}",
+                   "BUS", bus, "ADDR", address);
         return std::nullopt;
     }
     if (res == resCodes::resWarn)
     {
-        std::cerr << "Warnings while parsing FRU for device at bus " << bus
-                  << " address " << address << "\n";
+        lg2::error(
+            "Warnings while parsing FRU for device at bus {BUS} address {ADDR}",
+            "BUS", bus, "ADDR", address);
     }
 
     auto productNameFind = formattedFRU.find("BOARD_PRODUCT_NAME");
@@ -1622,7 +1624,7 @@
     }
     catch (const std::invalid_argument& e)
     {
-        std::cerr << "Failure getting FRU Info" << e.what() << "\n";
+        lg2::error("Failure getting FRU Info: {ERR}", "ERR", e);
         return false;
     }
 
