use phosphor-logging

Migrate all instances of std::cerr and std::cout to phosphor-logging
such as lg2::error, lg2::info, lg2::debug, ...

The use of modern logging infrastructure helps with development since
additional logging levels such as `debug` and `warning` are available.

Migrating the remaining logging calls helps to make the code more
readable and uniform.

Tested: Inspection, and on Tyan S8030

Restarted EM with patch applied.
Logs appear as usual.

```
Sep 15 13:52:46 s8030-bmc-30303035c0c1 entity-manager[23480]: Inventory Added: Supermicro PWS 920P SQ 0
Sep 15 13:52:46 s8030-bmc-30303035c0c1 entity-manager[23480]: Inventory Added: Supermicro PWS 920P SQ 1
Sep 15 13:52:46 s8030-bmc-30303035c0c1 entity-manager[23480]: Inventory Added: Tyan S8030 Baseboard
Sep 15 13:52:46 s8030-bmc-30303035c0c1 entity-manager[23480]: Inventory Added: MBX 1.57 Chassis
```

`busctl tree` output appears as before.

Did a power cycle to trigger a few more log prints

```
Sep 15 13:55:14 s8030-bmc-30303035c0c1 entity-manager[23480]: power match triggered
```

Created configuration file with missing fields to trigger error print.
```
{
  "Exposes": [],
  "Type": "error"
}
```

```
Sep 15 13:56:58 s8030-bmc-30303035c0c1 entity-manager[23659]: Finished loading json configuration in 7938ms
Sep 15 13:56:58 s8030-bmc-30303035c0c1 entity-manager[23659]: configuration file missing probe:
                                                               {"Exposes":[],"Type":"error"}
Sep 15 13:56:59 s8030-bmc-30303035c0c1 entity-manager[23659]: configuration file missing probe:
                                                               {"Exposes":[],"Type":"error"}
```

Change-Id: I3452f983c9c14cd02ab9b56451c4b3e4a13c3979
Signed-off-by: Alexander Hansen <alexander.hansen@9elements.com>
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;
     }