PEL: Create trace wrapper for peltool

In preparation for peltool being compiled for non-BMC platforms where
libphosphor_logging.so isn't available, create a wrapper function for
tracing so phosphor::logging::log() isn't directly used by the code that
is part of peltool.

For now, the wrapper will just call phosphor::logging::log, but in the
future will be changed to call std::cerr when not on the BMC.

A few files were changed to make use of the new calls.  Others will be
done with future commits.  Only the code that is built into peltool
needs to use this.  This mostly consists of the PEL section classes.

Using this new API does mean no extra data can be stored in the journal
metadata, as the systemd journal may not be available on some platforms
the tool may need to run on, such as AIX.  Instead, the data can just be
added into the trace string itself.

In a future commit, the meson.build file will be refactored to remove
the libphosphor_logging dependency so the build will fail if a call to
the phosphor-logging's log() is made within peltool code.

Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I5e6c235d60466b031e15b157860c07a3f8ddb148
diff --git a/extensions/openpower-pels/callout.cpp b/extensions/openpower-pels/callout.cpp
index f54d77e..a1d5ebe 100644
--- a/extensions/openpower-pels/callout.cpp
+++ b/extensions/openpower-pels/callout.cpp
@@ -15,7 +15,9 @@
  */
 #include "callout.hpp"
 
-#include <phosphor-logging/log.hpp>
+#include "trace.hpp"
+
+#include <fmt/format.h>
 
 namespace openpower
 {
@@ -24,8 +26,6 @@
 namespace src
 {
 
-using namespace phosphor::logging;
-
 constexpr size_t locationCodeMaxSize = 80;
 
 Callout::Callout(Stream& pel)
@@ -70,8 +70,8 @@
                 break;
             }
             default:
-                log<level::ERR>("Invalid Callout subsection type",
-                                entry("CALLOUT_TYPE=0x%X", type));
+                trace::error(
+                    fmt::format("Invalid Callout subsection type {}", type));
                 throw std::runtime_error("Invalid Callout subsection type");
                 break;
         }
diff --git a/extensions/openpower-pels/callouts.cpp b/extensions/openpower-pels/callouts.cpp
index 885dda5..ae95d3e 100644
--- a/extensions/openpower-pels/callouts.cpp
+++ b/extensions/openpower-pels/callouts.cpp
@@ -15,7 +15,9 @@
  */
 #include "callouts.hpp"
 
-#include <phosphor-logging/log.hpp>
+#include "trace.hpp"
+
+#include <algorithm>
 
 namespace openpower
 {
@@ -58,8 +60,7 @@
     }
     else
     {
-        using namespace phosphor::logging;
-        log<level::INFO>("Dropping PEL callout because at max");
+        trace::info("Dropping PEL callout because at max");
     }
 
     // Mapping including the  3 Medium levels as A,B and C
@@ -76,4 +77,4 @@
 
 } // namespace src
 } // namespace pels
-} // namespace openpower
\ No newline at end of file
+} // namespace openpower
diff --git a/extensions/openpower-pels/extended_user_data.cpp b/extensions/openpower-pels/extended_user_data.cpp
index 6370459..cc7d901 100644
--- a/extensions/openpower-pels/extended_user_data.cpp
+++ b/extensions/openpower-pels/extended_user_data.cpp
@@ -19,15 +19,13 @@
 #ifdef PELTOOL
 #include "user_data_json.hpp"
 #endif
-#include <fmt/format.h>
+#include "trace.hpp"
 
-#include <phosphor-logging/log.hpp>
+#include <fmt/format.h>
 
 namespace openpower::pels
 {
 
-using namespace phosphor::logging;
-
 void ExtendedUserData::unflatten(Stream& stream)
 {
     stream >> _header;
@@ -60,9 +58,8 @@
     }
     catch (const std::exception& e)
     {
-        log<level::ERR>(
-            fmt::format("Cannot unflatten ExtendedUserData: {}", e.what())
-                .c_str());
+        trace::error(
+            fmt::format("Cannot unflatten ExtendedUserData: {}", e.what()));
         _valid = false;
     }
 }
@@ -88,9 +85,8 @@
 {
     if (header().id != static_cast<uint16_t>(SectionID::extUserData))
     {
-        log<level::ERR>(
-            fmt::format("Invalid ExtendedUserData section ID {}", header().id)
-                .c_str());
+        trace::error(
+            fmt::format("Invalid ExtendedUserData section ID {}", header().id));
         _valid = false;
     }
     else
diff --git a/extensions/openpower-pels/private_header.cpp b/extensions/openpower-pels/private_header.cpp
index 31e0f61..74d895c 100644
--- a/extensions/openpower-pels/private_header.cpp
+++ b/extensions/openpower-pels/private_header.cpp
@@ -19,8 +19,9 @@
 #include "log_id.hpp"
 #include "pel_types.hpp"
 #include "pel_values.hpp"
+#include "trace.hpp"
 
-#include <phosphor-logging/log.hpp>
+#include <fmt/format.h>
 
 namespace openpower
 {
@@ -28,7 +29,6 @@
 {
 
 namespace pv = openpower::pels::pel_values;
-using namespace phosphor::logging;
 
 PrivateHeader::PrivateHeader(uint16_t componentID, uint32_t obmcLogID,
                              uint64_t timestamp)
@@ -77,8 +77,8 @@
     }
     catch (const std::exception& e)
     {
-        log<level::ERR>("Cannot unflatten private header",
-                        entry("ERROR=%s", e.what()));
+        trace::error(
+            fmt::format("Cannot unflatten private header: {}", e.what()));
         _valid = false;
     }
 }
@@ -126,22 +126,22 @@
 
     if (header().id != static_cast<uint16_t>(SectionID::privateHeader))
     {
-        log<level::ERR>("Invalid private header section ID",
-                        entry("ID=0x%X", header().id));
+        trace::error(fmt::format("Invalid private header section ID: {:#X}",
+                                 header().id));
         failed = true;
     }
 
     if (header().version != privateHeaderVersion)
     {
-        log<level::ERR>("Invalid private header version",
-                        entry("VERSION=0x%X", header().version));
+        trace::error(fmt::format("Invalid private header version: {}",
+                                 header().version));
         failed = true;
     }
 
     if (_sectionCount < minSectionCount)
     {
-        log<level::ERR>("Invalid section count in private header",
-                        entry("SECTION_COUNT=0x%X", _sectionCount));
+        trace::error(fmt::format("Invalid section count in private header: {}",
+                                 _sectionCount));
         failed = true;
     }
 
diff --git a/extensions/openpower-pels/tools/peltool.cpp b/extensions/openpower-pels/tools/peltool.cpp
index 3acfd8a..0e24850 100644
--- a/extensions/openpower-pels/tools/peltool.cpp
+++ b/extensions/openpower-pels/tools/peltool.cpp
@@ -21,14 +21,15 @@
 #include "../pel.hpp"
 #include "../pel_types.hpp"
 #include "../pel_values.hpp"
+#include "trace.hpp"
 
 #include <Python.h>
+#include <fmt/format.h>
 
 #include <CLI/CLI.hpp>
 #include <bitset>
 #include <fstream>
 #include <iostream>
-#include <phosphor-logging/log.hpp>
 #include <regex>
 #include <string>
 #include <xyz/openbmc_project/Common/File/error.hpp>
@@ -36,7 +37,6 @@
 #include "config_main.h"
 
 namespace fs = std::filesystem;
-using namespace phosphor::logging;
 using namespace openpower::pels;
 namespace file_error = sdbusplus::xyz::openbmc_project::Common::File::Error;
 namespace message = openpower::pels::message;
@@ -320,8 +320,7 @@
         std::vector<uint8_t> data = getFileData(fileName);
         if (data.empty())
         {
-            log<level::ERR>("Empty PEL file",
-                            entry("FILENAME=%s", fileName.c_str()));
+            trace::error(fmt::format("Empty PEL file {}", fileName));
             return listStr;
         }
         PEL pel{data};
@@ -444,9 +443,8 @@
     }
     catch (const std::exception& e)
     {
-        log<level::ERR>("Hit exception while reading PEL File",
-                        entry("FILENAME=%s", fileName.c_str()),
-                        entry("ERROR=%s", e.what()));
+        trace::error(fmt::format("Hit exception when reading PEL file {}: {}",
+                                 fileName, e.what()));
     }
     return listStr;
 }
@@ -648,7 +646,7 @@
  */
 void deleteAllPELs()
 {
-    log<level::INFO>("peltool deleting all event logs");
+    trace::info("peltool deleting all event logs");
 
     for (const auto& entry : fs::directory_iterator(pelLogDir()))
     {
diff --git a/extensions/openpower-pels/trace.hpp b/extensions/openpower-pels/trace.hpp
new file mode 100644
index 0000000..6bf65cf
--- /dev/null
+++ b/extensions/openpower-pels/trace.hpp
@@ -0,0 +1,30 @@
+#pragma once
+
+#include <phosphor-logging/log.hpp>
+
+using namespace phosphor::logging;
+
+namespace openpower::pels::trace
+{
+
+inline void info(const std::string& message)
+{
+    log<level::INFO>(message.c_str());
+}
+
+inline void error(const std::string& message)
+{
+    log<level::ERR>(message.c_str());
+}
+
+inline void warning(const std::string& message)
+{
+    log<level::WARNING>(message.c_str());
+}
+
+inline void debug(const std::string& message)
+{
+    log<level::DEBUG>(message.c_str());
+}
+
+} // namespace openpower::pels::trace
diff --git a/extensions/openpower-pels/user_data.cpp b/extensions/openpower-pels/user_data.cpp
index e8a72ef..e400e35 100644
--- a/extensions/openpower-pels/user_data.cpp
+++ b/extensions/openpower-pels/user_data.cpp
@@ -18,19 +18,19 @@
 #include "json_utils.hpp"
 #include "pel_types.hpp"
 #include "user_data_formats.hpp"
+
+#include <fmt/format.h>
 #ifdef PELTOOL
 #include "user_data_json.hpp"
 #endif
 
-#include <phosphor-logging/log.hpp>
+#include "trace.hpp"
 
 namespace openpower
 {
 namespace pels
 {
 
-using namespace phosphor::logging;
-
 void UserData::unflatten(Stream& stream)
 {
     stream >> _header;
@@ -61,8 +61,7 @@
     }
     catch (const std::exception& e)
     {
-        log<level::ERR>("Cannot unflatten user data",
-                        entry("ERROR=%s", e.what()));
+        trace::error(fmt::format("Cannot unflatten user data: {}", e.what()));
         _valid = false;
     }
 }
@@ -85,8 +84,8 @@
 {
     if (header().id != static_cast<uint16_t>(SectionID::userData))
     {
-        log<level::ERR>("Invalid user data section ID",
-                        entry("ID=0x%X", header().id));
+        trace::error(
+            fmt::format("Invalid user data section ID: {}", header().id));
         _valid = false;
     }
     else