NVMe: use phosphor-logging/lg2 for logging
Inspired by https://gerrit.openbmc.org/c/openbmc/dbus-sensors/+/78412.
Using lg2 for nvmed logging.
Also, utilize log level to concise the log printing.
* using lg2::warning for all retries
* using lg2::error for errors
* using lg2::info for the state transition info
* using lg2::debug for all debug related stuff
Fix some minor issue which was not detected by std::cerr.
Tested: journal log: https://paste.googleplex.com/6575901127081984
Change-Id: Ia14236654c2b12034e3d087ca84a5168c62106ea
Signed-off-by: Hao Jiang <jianghao@google.com>
diff --git a/src/NVMeBasic.cpp b/src/NVMeBasic.cpp
index de71423..f8fca8b 100644
--- a/src/NVMeBasic.cpp
+++ b/src/NVMeBasic.cpp
@@ -7,6 +7,7 @@
#include <boost/asio/read.hpp>
#include <boost/asio/streambuf.hpp>
#include <boost/asio/write.hpp>
+#include <phosphor-logging/lg2.hpp>
#include <iostream>
#include <map>
@@ -72,9 +73,9 @@
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg)
if (::ioctl(fileHandle.handle(), I2C_SLAVE, addr) == -1)
{
- std::cerr << "Failed to configure device address 0x" << std::hex
- << (int)addr << " for bus " << std::dec << bus << ": "
- << strerror(errno) << "\n";
+ lg2::error(
+ "Failed to configure device address '{ADDR}' for bus '{BUS}': ERRNO",
+ "ADDR", lg2::hex, addr, "BUS", bus, "ERRNO", lg2::hex, errno);
resp.resize(0);
return;
}
@@ -85,16 +86,17 @@
size = i2c_smbus_read_block_data(fileHandle.handle(), cmd, resp.data());
if (size < 0)
{
- std::cerr << "Failed to read block data from device 0x" << std::hex
- << (int)addr << " on bus " << std::dec << bus << ": "
- << strerror(errno) << "\n";
+ lg2::error(
+ "Failed to read block data from device '{ADDR}' on bus '{BUS}': ERRNO",
+ "ADDR", lg2::hex, addr, "BUS", bus, "ERRNO", lg2::hex, errno);
resp.resize(0);
}
else if (size > UINT8_MAX + 1)
{
- std::cerr << "Unexpected message length from device 0x" << std::hex
- << (int)addr << " on bus " << std::dec << bus << ": "
- << size << " (" << UINT8_MAX << ")\n";
+ lg2::error(
+ "Unexpected message length from device '{ADDR}' on bus '{BUS}': '{SIZE}' ({MAX})",
+ "ADDR", lg2::hex, addr, "BUS", bus, "SIZE", size, "MAX",
+ UINT8_MAX);
resp.resize(0);
}
else
@@ -104,8 +106,8 @@
}
catch (const std::out_of_range& e)
{
- std::cerr << "Failed to create file handle for bus " << std::dec << bus
- << ": " << e.what() << "\n";
+ lg2::error("Failed to create file handle for bus '{BUS}': '{ERR}'",
+ "BUS", bus, "ERR", e);
resp.resize(0);
}
}
@@ -129,8 +131,9 @@
ssize_t rc = ::read(in.handle(), req.data(), req.size());
if (rc != static_cast<ssize_t>(req.size()))
{
- std::cerr << "Failed to read request from in descriptor "
- << strerror(errno) << "\n";
+ lg2::error(
+ "Failed to read request from in descriptor '{ERROR_MESSAGE}'",
+ "ERROR_MESSAGE", strerror(errno));
if (rc != 0)
{
return -errno;
@@ -148,9 +151,9 @@
rc = ::write(out.handle(), &len, sizeof(len));
if (rc != sizeof(len))
{
- std::cerr << "Failed to write block (" << std::dec << len
- << ") length to out descriptor: "
- << strerror(static_cast<int>(-rc)) << "\n";
+ lg2::error(
+ "Failed to write block ({LEN}) length to out descriptor: '{ERRNO}'",
+ "LEN", len, "ERRNO", strerror(static_cast<int>(-rc)));
if (rc != 0)
{
return -errno;
@@ -166,9 +169,9 @@
ssize_t egress = ::write(out.handle(), &(*cursor), lenRemaining);
if (egress == -1)
{
- std::cerr << "Failed to write block data of length " << std::dec
- << lenRemaining << " to out pipe: " << strerror(errno)
- << "\n";
+ lg2::error(
+ "Failed to write block data of length '{LEN}' to out pipe: '{ERROR_MESSAGE}'",
+ "LEN", lenRemaining, "ERROR_MESSAGE", strerror(errno));
if (rc != 0)
{
return -errno;
@@ -194,26 +197,26 @@
/* Set up inter-thread communication */
if (::pipe(requestPipe.data()) == -1)
{
- std::cerr << "Failed to create request pipe: " << strerror(errno)
- << "\n";
+ lg2::error("Failed to create request pipe: '{ERROR}'", "ERROR",
+ strerror(errno));
throw std::error_code(errno, std::system_category());
}
if (::pipe(responsePipe.data()) == -1)
{
- std::cerr << "Failed to create response pipe: " << strerror(errno)
- << "\n";
+ lg2::error("Failed to create response pipe: '{ERROR}'", "ERROR",
+ strerror(errno));
if (::close(requestPipe[0]) == -1)
{
- std::cerr << "Failed to close write fd of request pipe: "
- << strerror(errno) << "\n";
+ lg2::error("Failed to close write fd of request pipe '{ERROR}'",
+ "ERROR", strerror(errno));
}
if (::close(requestPipe[1]) == -1)
{
- std::cerr << "Failed to close read fd of request pipe: "
- << strerror(errno) << "\n";
+ lg2::error("Failed to close read fd of request pipe '{ERROR}'",
+ "ERROR", strerror(errno));
}
throw std::error_code(errno, std::system_category());
@@ -231,11 +234,11 @@
if ((rc = procFunc(streamIn, streamOut)) < 0)
{
- std::cerr << "Failure while processing query stream: "
- << strerror(static_cast<int>(-rc)) << "\n";
+ lg2::error("Failure while processing query stream: '{ERROR}'",
+ "ERROR", strerror(static_cast<int>(-rc)));
}
- std::cerr << "Terminating basic query thread\n";
+ lg2::error("Terminating basic query thread");
});
}
@@ -269,7 +272,8 @@
[command](boost::system::error_code ec, std::size_t) {
if (ec)
{
- std::cerr << "Got error writing basic query: " << ec << "\n";
+ lg2::error("Got error writing basic query: '{ERROR_MESSAGE}'",
+ "ERROR_MESSAGE", ec.message());
}
});
@@ -282,7 +286,8 @@
[response](const boost::system::error_code& ec, std::size_t n) {
if (ec)
{
- std::cerr << "Got error completing basic query: " << ec << "\n";
+ lg2::error("Got error completing basic query: '{ERROR_MESSAGE}'",
+ "ERROR_MESSAGE", ec.message());
return static_cast<std::size_t>(0);
}
@@ -296,8 +301,9 @@
if (n > len + 1)
{
- std::cerr << "Query stream has become unsynchronised: " << "n: "
- << n << ", " << "len: " << len << "\n";
+ lg2::error(
+ "Query stream has become unsynchronised: n: {N}, len: {LEN}",
+ "N", n, "LEN", len);
return static_cast<std::size_t>(0);
}
@@ -318,7 +324,8 @@
const boost::system::error_code& ec, std::size_t length) mutable {
if (ec)
{
- std::cerr << "Got error reading basic query: " << ec << "\n";
+ lg2::error("Got error reading basic query: '{ERROR_MESSAGE}'",
+ "ERROR_MESSAGE", ec.message());
boost::asio::post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::io_error), nullptr);
});
@@ -327,7 +334,7 @@
if (length == 0)
{
- std::cerr << "Invalid message length: " << length << "\n";
+ lg2::error("Invalid message length: '{LEN}'", "LEN", length);
return;
}
diff --git a/src/NVMeCache.hpp b/src/NVMeCache.hpp
index d1869ef..bf8e538 100644
--- a/src/NVMeCache.hpp
+++ b/src/NVMeCache.hpp
@@ -1,9 +1,10 @@
#pragma once
#include <boost/asio/steady_timer.hpp>
+#include <phosphor-logging/lg2.hpp>
#include <chrono>
+#include <format>
#include <functional>
-#include <iostream>
#include <memory>
#include <set>
#include <vector>
@@ -215,8 +216,7 @@
auto metric = itr->second.lock();
if (!metric)
{
- // LOG_INFO
- std::cerr << "the task is invalid, removed from task queue\n";
+ lg2::info("the task is invalid, removed from task queue");
itr = taskQueue.erase(itr);
}
else if (!metric.owner_before(task) &&
@@ -256,8 +256,7 @@
weakFlag](boost::system::error_code ec) {
if (ec || weakFlag.expired())
{
- // LOG_INFO
- std::cerr << "new expiration time set\n";
+ lg2::info("new expiration time set");
return;
}
@@ -265,8 +264,7 @@
if (!self)
{
- // LOG_INFO
- std::cerr << "the scheduler has stopped\n";
+ lg2::info("the scheduler has stopped");
return;
}
@@ -275,8 +273,7 @@
auto task = weakTask.lock();
if (!task)
{
- // LOG_INFO
- std::cerr << "the task is invalid, removed from task queue\n";
+ lg2::info("the task is invalid, removed from task queue");
self->dequeue();
return;
}
@@ -290,7 +287,7 @@
std::shared_ptr<MetricBase<ClockType_>> task = weakTask.lock();
if (!task)
{
- std::cerr << "the task is invalid, removed from task queue\n";
+ lg2::info("the task is invalid, removed from task queue");
self->executingTask.reset();
self->dequeue();
return;
diff --git a/src/NVMeCacheImpl.hpp b/src/NVMeCacheImpl.hpp
index 0f5968f..51252f9 100644
--- a/src/NVMeCacheImpl.hpp
+++ b/src/NVMeCacheImpl.hpp
@@ -100,9 +100,8 @@
ControllerLogPageMetric<LID, ClockType>>(weakSelf.lock());
if (!self)
{
- // TODO: error_level = INFO
- std::cerr << std::format(
- "[{}, {}]metric released before callback\n", path, id);
+ lg2::info("metric released before callback", "PATH", path, "ID",
+ id);
// The Scheduler will clear the invalid cache Task
cb({}, 4096, true);
return;
@@ -112,19 +111,17 @@
if (self->errorCount <
ControllerLogPageMetric<LID, ClockType>::errorCountMax)
{
- // TODO: error_level = WARN
- std::cerr << std::format(
- "[{}, {}]fail to fresh log page at retry({})\n", path,
- id, self->errorCount++);
+ lg2::warning("fail to fresh log page at retry({RETRY})",
+ "PATH", path, "ID", id, "RETRY",
+ self->errorCount++);
// Schedule the retry after 1s
// TODO: costomize the retry delay for each log pages.
cb(std::make_error_code(std::errc::io_error), 4096, false);
return;
}
-
- std::cerr << std::format(
- "[{}, {}]retry exhausted to fresh log page\n", path, id);
+ lg2::error("retry exhausted to fresh log page", "PATH", path,
+ "ID", id);
self->cacheValid = false;
// Notify the RefreshCB with error code; the task will
@@ -247,9 +244,8 @@
weakSelf.lock());
if (!self)
{
- // TODO: error_level = INFO
- std::cerr << std::format(
- "[{}, {}]metric released before callback\n", path, id);
+ lg2::info("metric released before callback", "PATH", path, "ID",
+ id);
// The Scheduler will clear the invalid cache Task
cb({}, 4096, true);
return;
@@ -259,18 +255,17 @@
if (self->errorCount <
IdentifyMetric<CNS, ClockType>::errorCountMax)
{
- // TODO: error_level = WARN
- std::cerr << std::format(
- "[{}, {}]fail to fresh identify at retry({}): {}\n",
- path, id, self->errorCount++, ex->description());
+ lg2::warning(
+ "fail to fresh identify at retry({RETRY}): {ERROR}",
+ "PATH", path, "ID", id, "RETRY", self->errorCount++,
+ "ERROR", ex->description());
// Schedule the retry after 1s
cb(std::make_error_code(std::errc::io_error), 4096, false);
return;
}
- std::cerr << std::format(
- "[{}, {}]retry exhausted to fresh identify: {}\n", path, id,
- ex->description());
+ lg2::error("retry exhausted to fresh identify: {ERROR}", "PATH",
+ path, "ID", id, "ERROR", ex->description());
self->cacheValid = false;
// Notify the RefreshCB with error code; the task will
diff --git a/src/NVMeController.cpp b/src/NVMeController.cpp
index 427b484..881f225 100644
--- a/src/NVMeController.cpp
+++ b/src/NVMeController.cpp
@@ -8,6 +8,7 @@
#include "NVMePlugin.hpp"
#include "NVMeSubsys.hpp"
+#include <phosphor-logging/lg2.hpp>
#include <sdbusplus/exception.hpp>
#include <sdbusplus/message/native_types.hpp>
#include <xyz/openbmc_project/Common/File/error.hpp>
@@ -16,7 +17,6 @@
#include <cstdio>
#include <filesystem>
#include <fstream>
-#include <iostream>
// using sdbusplus::xyz::openbmc_project::Inventory::Item::server::
// StorageController;
@@ -81,7 +81,7 @@
if (self->status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
return self->adminNonDataCmdMethod(std::move(yield), opcode, cdw1, cdw2,
@@ -106,7 +106,7 @@
if (self->status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -128,7 +128,7 @@
if (self->status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -154,7 +154,7 @@
if (self->status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -174,7 +174,7 @@
if (self->status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -308,7 +308,7 @@
auto s = subsys.lock();
if (!s)
{
- std::cerr << "makeAssociation() after shutdown\n";
+ lg2::error("makeAssociation() after shutdown");
return associations;
}
@@ -335,15 +335,15 @@
{
if (status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
std::array<int, 2> pipe{};
if (::pipe(pipe.data()) < 0)
{
- std::cerr << "GetLogPage fails to open pipe: " << std::strerror(errno)
- << '\n';
+ lg2::error("GetLogPage fails to open pipe: {ERROR}", "ERROR",
+ strerror(errno));
throw sdbusplus::xyz::openbmc_project::Common::File::Error::Open();
}
@@ -356,7 +356,8 @@
std::span<uint8_t> data) {
if (ec)
{
- std::cerr << "fail to GetLogPage: " << ec.message() << '\n';
+ lg2::error("fail to GetLogPage: {ERROR}", "ERROR",
+ ec.message());
close(pipe[1]);
close(pipe[0]);
return;
@@ -377,9 +378,8 @@
std::size_t /* transferredSize */) {
if (error)
{
- std::cerr
- << "GetLogPage fails to write fd: " << error.message()
- << '\n';
+ lg2::error("GetLogPage fails to write fd: {ERROR}", "ERROR",
+ error.message());
}
});
@@ -409,7 +409,8 @@
std::span<uint8_t> data) {
if (ec)
{
- std::cerr << "fail to GetLogPage: " << ec.message() << '\n';
+ lg2::error("fail to GetLogPage: {ERROR}", "ERROR",
+ ec.message());
close(pipe[1]);
close(pipe[0]);
return;
@@ -431,8 +432,8 @@
std::size_t /* transferredSize */) {
if (error)
{
- std::cerr << "GetLogPage fails to write fd: "
- << error.message() << '\n';
+ lg2::error("GetLogPage fails to write fd: {ERROR}",
+ "ERROR", error.message());
}
});
@@ -474,15 +475,15 @@
{
if (status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
std::array<int, 2> pipe{};
if (::pipe(pipe.data()) < 0)
{
- std::cerr << "Identify fails to open pipe: " << std::strerror(errno)
- << '\n';
+ lg2::error("Identify fails to open pipe: {ERROR}", "ERROR",
+ strerror(errno));
throw sdbusplus::xyz::openbmc_project::Common::File::Error::Open();
}
@@ -491,7 +492,7 @@
[pipe, &io = this->io](const nvme_ex_ptr& ex, std::span<uint8_t> data) {
if (ex)
{
- std::cerr << "fail to Identify: " << ex << '\n';
+ lg2::error("fail to Identify: {ERROR}", "ERROR", ex->what());
close(pipe[1]);
close(pipe[0]);
return;
@@ -512,8 +513,8 @@
std::size_t /* transferredSize */) {
if (error)
{
- std::cerr << "Identify fails to write fd: " << error.message()
- << '\n';
+ lg2::error("Identify fails to write fd: {ERROR}", "ERROR",
+ error.message());
}
});
@@ -558,7 +559,7 @@
if (status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -684,7 +685,7 @@
{
if (status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -714,7 +715,7 @@
{
if (status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -765,8 +766,8 @@
},
yield);
- std::cerr << "nvme_status:" << nvmeStatus << ", dw0:" << completionDw0
- << '\n';
+ lg2::debug("nvme_status:{STATUS}, dw0:{DW0}", "STATUS", nvmeStatus, "DW0",
+ completionDw0);
if (nvmeStatus < 0)
{
throw sdbusplus::exception::SdBusError(err.value(),
@@ -797,7 +798,7 @@
{
if (status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -844,7 +845,7 @@
}
catch (const std::exception& e)
{
- std::cerr << e.what() << '\n';
+ lg2::error("{ERROR}", "ERROR", e.what());
throw sdbusplus::xyz::openbmc_project::Common::Error::
InternalFailure();
}
@@ -859,7 +860,7 @@
{
if (status != Status::Enabled)
{
- std::cerr << "Controller has been disabled" << '\n';
+ lg2::error("Controller has been disabled");
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
@@ -906,7 +907,7 @@
}
catch (const std::exception& e)
{
- std::cerr << e.what() << '\n';
+ lg2::error("{ERROR}", "ERROR", e.what());
throw sdbusplus::xyz::openbmc_project::Common::Error::
InternalFailure();
}
diff --git a/src/NVMeDrive.cpp b/src/NVMeDrive.cpp
index 48bb6c1..d022961 100644
--- a/src/NVMeDrive.cpp
+++ b/src/NVMeDrive.cpp
@@ -3,7 +3,7 @@
#include "NVMeError.hpp"
#include "NVMeSubsys.hpp"
-#include <iostream>
+#include <phosphor-logging/lg2.hpp>
namespace common_err = sdbusplus::xyz::openbmc_project::Common::Error;
@@ -118,8 +118,8 @@
(void)scdw10;
if (ex)
{
- std::cerr << "Error returned reading sanitize log: " << ex
- << '\n';
+ lg2::error("Error returned reading sanitize log: {ERROR}",
+ "ERROR", ex->what());
}
else
{
diff --git a/src/NVMeError.cpp b/src/NVMeError.cpp
index eda98de..85e4ea5 100644
--- a/src/NVMeError.cpp
+++ b/src/NVMeError.cpp
@@ -2,6 +2,7 @@
#include <libnvme-mi.h>
+#include <phosphor-logging/lg2.hpp>
#include <xyz/openbmc_project/Common/Device/error.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
@@ -177,7 +178,8 @@
if (nvmeStatus < 0)
{
auto desc = std::string("libnvme error: ") + err.message();
- std::cerr << methodName << ":" << desc << '\n';
+ lg2::error("{METHOD}: {DESC}", "METHOD", methodName, "DESC",
+ desc.c_str());
return std::make_shared<NVMeSdBusPlusError>(desc);
}
if (nvmeStatus > 0)
@@ -196,11 +198,11 @@
translateLibNVMeMI(val, desc, specific);
break;
default:
- std::cerr << "Unknown libnvme error status " << nvmeStatus
- << '\n';
+ lg2::error("Unknown libnvme error status {STATUS}", "STATUS",
+ nvmeStatus);
desc = "Unknown libnvme error";
}
- std::cerr << methodName << ":" << desc << '\n';
+ lg2::error("{METHOD}: {DESC}", "METHOD", methodName, "DESC", desc);
return std::make_shared<NVMeSdBusPlusError>(desc, specific);
}
// No Error
diff --git a/src/NVMeMetricStore.cpp b/src/NVMeMetricStore.cpp
index d3f577f..ff39271 100644
--- a/src/NVMeMetricStore.cpp
+++ b/src/NVMeMetricStore.cpp
@@ -1,5 +1,6 @@
#include "NVMeMetricStore.hpp"
+#include <phosphor-logging/lg2.hpp>
#include <xyz/openbmc_project/Common/File/error.hpp>
#include <xyz/openbmc_project/Common/error.hpp>
@@ -10,8 +11,8 @@
std::array<int, 2> pipe{};
if (::pipe(pipe.data()) < 0)
{
- std::cerr << "Metric Fetcher failed due to pipe creation "
- << std::strerror(errno) << "\n";
+ lg2::error("Metric Fetcher failed due to pipe creation: {ERROR}",
+ "ERROR", strerror(errno));
throw sdbusplus::xyz::openbmc_project::Common::File::Error::Open{};
}
@@ -29,8 +30,8 @@
std::size_t /* transferredSize */) {
if (error)
{
- std::cerr << "Metric Fetcher fails to write fd: " << error.message()
- << "\n";
+ lg2::error("Metric Fetcher fails to write fd: {ERROR}", "ERROR",
+ error.message());
}
});
@@ -57,15 +58,15 @@
auto it = metricStore.find(name);
if (it == metricStore.end() || !it->second)
{
- std::cerr << std::format("[{}, {}]cannot find the target Metric",
- this->path, name);
+ lg2::error("Cannot find the target Metric", "PATH", this->path, "NAME",
+ name);
throw sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument{};
}
if (!it->second->isCacheValid())
{
- std::cerr << std::format("[{}, {}]the Metric cache is invalid",
- this->path, name);
+ lg2::error("The Metric cache is invalid", "PATH", this->path, "NAME",
+ name);
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable{};
}
auto data = it->second->getCache();
diff --git a/src/NVMeMetricStore.hpp b/src/NVMeMetricStore.hpp
index 607108b..1d22c39 100644
--- a/src/NVMeMetricStore.hpp
+++ b/src/NVMeMetricStore.hpp
@@ -18,7 +18,6 @@
#include <xyz/openbmc_project/NVMe/MetricStore/server.hpp>
#include <functional>
-#include <iostream>
#include <memory>
#include <string>
#include <tuple>
@@ -71,9 +70,8 @@
std::string{metric->getIdentifier()}, std::move(metric));
if (!res)
{
- std::cerr << std::format(
- "[{}, {}] drop a duplicated vendor metic\n", path,
- itr->first);
+ lg2::warning("drop a duplicated vendor metic", "PATH", path,
+ "METRIC", itr->first);
}
}
@@ -89,10 +87,9 @@
// use validFlag to protect this call
if (weakFlag.expired())
{
- // TODO: log_level = INFO
- std::cerr << std::format(
- "[{}]MetricStore interface expired, update signal skipped.\n",
- path);
+ lg2::info("MetricStore interface expired, update signal "
+ "skipped.",
+ "PATH", path);
return;
}
auto metric = weakMetric.lock();
diff --git a/src/NVMeMi.cpp b/src/NVMeMi.cpp
index 32162ae..46cbd94 100644
--- a/src/NVMeMi.cpp
+++ b/src/NVMeMi.cpp
@@ -6,11 +6,11 @@
#include <endian.h>
#include <boost/endian.hpp>
+#include <phosphor-logging/lg2.hpp>
#include <cassert>
#include <cerrno>
#include <fstream>
-#include <iostream>
#include <stdexcept>
namespace common_err = sdbusplus::xyz::openbmc_project::Common::Error;
@@ -63,9 +63,8 @@
case Status::Initiated:
if (optimizeTimer)
{
- std::cerr << "[" << endpoint->describe() << "]"
- << "Cancel the optimization Timer for the endpoint"
- << '\n';
+ lg2::info("Cancel the optimization Timer for the endpoint",
+ "ENDPOINT", endpoint->describe());
optimizeTimer->cancel();
}
[[fallthrough]];
@@ -76,8 +75,7 @@
"nvmeEP was unpopulated in Status::Initiated state");
}
mctpStatus = Status::Terminating;
- std::cerr << "[" << endpoint->describe() << "]"
- << "start MCTP closure" << '\n';
+ lg2::info("start MCTP closure", "ENDPOINT", endpoint->describe());
// Immediately reset endpoint so that we can capture the parameter
// from a subsequent invocation of start() while in
// Status::Terminating
@@ -91,8 +89,8 @@
self->mtu = 64;
self->nvmeEP = nullptr;
self->mctpStatus = Status::Reset;
- std::cerr << "[" << self->device->describe() << "] "
- << "end MCTP closure" << '\n';
+ lg2::info("end MCTP closure", "DEVICE",
+ self->device->describe());
if (self->restart)
{
// If restart is true then we've captured the updated
@@ -165,7 +163,8 @@
optimizeTimer->async_wait([this](boost::system::error_code ec) {
if (ec)
{
- std::cerr << "Endpoint optimize timer error " << ec << '\n';
+ lg2::error("Endpoint optimize timer error: {ERROR}", "ERROR",
+ ec.what());
return;
}
miSetMCTPConfiguration(
@@ -173,9 +172,8 @@
self->optimizeTimer = nullptr;
if (ec)
{
- std::cerr << "[" << self->device->describe() << "]"
- << "Failed setting up MTU for the MCTP endpoint."
- << '\n';
+ lg2::error("Failed setting up MTU for the MCTP endpoint.",
+ "DEVICE", self->device->describe());
self->recover();
return;
}
@@ -223,8 +221,7 @@
if (!epConnect(endpoint->network(), endpoint->eid()))
{
epReset();
- std::cerr << "[" << ep->describe() << "]"
- << "can't open MCTP endpoint " << '\n';
+ lg2::error("can't open MCTP endpoint", "ENDPOINT", ep->describe());
return;
}
}
@@ -344,7 +341,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << device->describe() << "]" << e.what() << '\n';
+ lg2::error("{ERROR}", "DEVICE", device->describe(), "ERROR", e.what());
return std::make_error_code(std::errc::no_such_device);
}
return {};
@@ -356,8 +353,7 @@
{
if (mctpStatus == Status::Reset || mctpStatus == Status::Terminating)
{
- std::cerr << "[" << device->describe() << "]"
- << "nvme endpoint is invalid" << '\n';
+ lg2::error("nvme endpoint is invalid", "DEVICE", device->describe());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device));
});
@@ -372,19 +368,19 @@
&smbusFreq);
if (rc != 0)
{
- std::cerr << "[" << ep->describe()
- << "] failed to get the SMBus frequency " << '\n';
+ lg2::error("failed to get the SMBus frequency", "ENDPOINT",
+ ep->describe());
}
else if (smbusFreq == NVME_MI_CONFIG_SMBUS_FREQ_100kHz)
{
- std::cerr << "[" << ep->describe()
- << "] Setting the SMBus frequency to 400kHz\n";
+ lg2::info("Setting the SMBus frequency to 400kHz", "ENDPOINT",
+ ep->describe());
rc = nvme_mi_mi_config_set_smbus_freq(
self->nvmeEP, portId, NVME_MI_CONFIG_SMBUS_FREQ_400kHz);
if (rc != 0)
{
- std::cerr << "[" << ep->describe()
- << "] failed to set the SMBus frequency\n";
+ lg2::error("failed to set the SMBus frequency", "ENDPOINT",
+ ep->describe());
}
}
if (rc != 0)
@@ -399,7 +395,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << device->describe() << "]" << e.what() << '\n';
+ lg2::error("{ERROR}", "DEVICE", device->describe(), "ERROR", e.what());
return;
}
}
@@ -410,8 +406,7 @@
{
if (mctpStatus == Status::Reset || mctpStatus == Status::Terminating)
{
- std::cerr << "[" << device->describe() << "] "
- << "nvme endpoint is invalid" << '\n';
+ lg2::error("nvme endpoint is invalid", "DEVICE", device->describe());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device));
});
@@ -428,9 +423,8 @@
if (rc != 0)
{
- std::cerr << "[" << self->device->describe() << "]"
- << " failed to set remote MCTP MTU for port :"
- << unsigned(port) << '\n';
+ lg2::error("failed to set remote MCTP MTU for port: {PORT}",
+ "DEVICE", self->device->describe(), "PORT", port);
self->io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::bad_message));
});
@@ -451,7 +445,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << device->describe() << "] " << e.what() << '\n';
+ lg2::error("{ERROR}", "DEVICE", device->describe(), "ERROR", e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device));
});
@@ -464,8 +458,7 @@
{
if (mctpStatus == Status::Reset || mctpStatus == Status::Terminating)
{
- std::cerr << "[" << device->describe() << "] "
- << "nvme endpoint is invalid" << '\n';
+ lg2::error("nvme endpoint is invalid", "DEVICE", device->describe());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device));
});
@@ -481,8 +474,8 @@
nvme_mi_ep_set_timeout(self->nvmeEP, timeout);
if (rc != 0)
{
- std::cerr << "[" << self->device->describe() << "] "
- << "Failed reading subsystem info failing " << '\n';
+ lg2::error("Failed reading subsystem info failing", "DEVICE",
+ self->device->describe());
self->io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::bad_message));
});
@@ -497,9 +490,9 @@
if (rc != 0)
{
/* PCIe port might not be ready right after AC/DC cycle. */
- std::cerr << "[" << self->device->describe()
- << "] failed reading port info for port_id: "
- << unsigned(portId) << '\n';
+ lg2::error("failed reading port info for port_id: {PORT}",
+ "DEVICE", self->device->describe(), "PORT",
+ portId);
}
else if (portInfo.portt == 0x2) // SMBus ports = 0x2
{
@@ -521,7 +514,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << device->describe() << "]" << e.what() << '\n';
+ lg2::error("{ERROR}", "DEVICE", device->describe(), "ERROR", e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device));
});
@@ -538,17 +531,16 @@
retries](const std::error_code& ec) mutable {
if (!endpoint)
{
- std::cerr << "[" << device->describe() << "] "
- << "failed to set MCTP path MTU: Status::Terminating"
- << '\n';
+ lg2::error("failed to set MCTP path MTU: Status::Terminating",
+ "DEVICE", device->describe());
cb(ec);
return;
}
if (!ec)
{
- std::cout << "[" << endpoint->describe() << "] "
- << "Finished MCTP initialization. MTU: " << mtu << '\n';
+ lg2::info("Finished MCTP initialization. MTU: {MTU}", "ENDPOINT",
+ endpoint->describe(), "MTU", mtu);
cb(ec);
return;
}
@@ -556,15 +548,14 @@
retries--;
if (retries == 0)
{
- std::cerr << "[" << endpoint->describe() << "] "
- << "failed to set MCTP path MTU: " << ec.message()
- << '\n';
+ lg2::error("failed to set MCTP path MTU: {ERROR}", "ENDPOINT",
+ endpoint->describe(), "ERROR", ec.message());
cb(ec);
return;
}
- std::cerr << "[" << endpoint->describe() << "] "
- << "retry to set MCTP path MTU" << '\n';
+ lg2::warning("retry to set MCTP path MTU", "ENDPOINT",
+ endpoint->describe());
configureLocalRouteMtu(std::move(cb), retries);
};
endpoint->setMtu(mctpMtu, std::move(retry));
@@ -576,8 +567,8 @@
{
if (auto degraded = isEndpointDegraded())
{
- std::cerr << "[" << device->describe() << "]"
- << " MCTP connection is not established" << '\n';
+ lg2::error("MCTP connection is not established", "DEVICE",
+ device->describe());
io.post([cb{std::move(cb)}, errc{degraded.value()}]() {
cb(errc, nullptr);
@@ -593,9 +584,9 @@
true, &ssHealth);
if (rc < 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << " fail to subsystem_health_status_poll: "
- << std::strerror(errno) << '\n';
+ lg2::error("fail to subsystem_health_status_poll: {ERROR}",
+ "ENDPOINT", ep->describe(), "ERROR",
+ strerror(errno));
self->io.post([cb{cb}, lastErrno{errno}]() mutable {
cb(std::make_error_code(static_cast<std::errc>(lastErrno)),
nullptr);
@@ -606,9 +597,8 @@
{
std::string_view errMsg =
statusToString(static_cast<nvme_mi_resp_status>(rc));
- std::cerr << "[" << ep->describe() << "]"
- << " fail to subsystem_health_status_poll: " << errMsg
- << '\n';
+ lg2::error("fail to subsystem_health_status_poll: {ERROR}",
+ "ENDPOINT", ep->describe(), "ERROR", errMsg.data());
self->io.post([cb{cb}]() mutable {
cb(std::make_error_code(std::errc::bad_message), nullptr);
});
@@ -621,7 +611,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << device->describe() << "]" << e.what() << '\n';
+ lg2::error("{ERROR}", "DEVICE", device->describe(), "ERROR", e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device), {});
});
@@ -635,8 +625,8 @@
{
if (auto degraded = isEndpointDegraded())
{
- std::cerr << "[" << device->describe() << "]"
- << " MCTP connection is not established" << '\n';
+ lg2::error("MCTP connection is not established", "DEVICE",
+ device->describe());
io.post(
[cb{std::move(cb)}, errc{degraded.value()}]() { cb(errc, {}); });
@@ -649,9 +639,8 @@
int rc = nvme_mi_scan_ep(self->nvmeEP, true);
if (rc < 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to scan controllers: "
- << std::strerror(errno) << '\n';
+ lg2::error("fail to scan controllers: {ERROR}", "ENDPOINT",
+ ep->describe(), "ERROR", strerror(errno));
self->io.post([cb{cb}, lastErrno{errno}]() mutable {
cb(std::make_error_code(static_cast<std::errc>(lastErrno)),
{});
@@ -662,8 +651,8 @@
{
std::string_view errMsg =
statusToString(static_cast<nvme_mi_resp_status>(rc));
- std::cerr << "[" << ep->describe() << "]"
- << "fail to scan controllers: " << errMsg << '\n';
+ lg2::error("fail to scan controllers: {ERROR}", "ENDPOINT",
+ ep->describe(), "ERROR", errMsg.data());
self->io.post([cb{cb}]() mutable {
cb(std::make_error_code(std::errc::bad_message), {});
});
@@ -682,7 +671,8 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << endpoint->describe() << "]" << e.what() << '\n';
+ lg2::error("{ERROR}", "ENDPOINT", endpoint->describe(), "ERROR",
+ e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device), {});
});
@@ -702,7 +692,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "Runtime error: " << e.what() << '\n';
+ lg2::error("Runtime error: {ERROR}", "ERROR", e.what());
return false;
}
}
@@ -713,8 +703,8 @@
{
if (auto degraded = isEndpointDegraded())
{
- std::cerr << "[" << device->describe() << "]"
- << " MCTP connection is not established" << '\n';
+ lg2::error("MCTP connection is not established", "DEVICE",
+ device->describe());
io.post([cb{std::move(cb)}, errc{degraded.value()}]() {
cb(makeLibNVMeError("nvme endpoint is degraded"), {});
});
@@ -770,23 +760,22 @@
if (rc < 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to do nvme identify: "
- << std::strerror(errno) << '\n';
+ lg2::error("fail to do nvme identify: {ERROR}", "ENDPOINT",
+ ep->describe(), "ERROR", strerror(errno));
}
else if (rc > 0)
{
std::string_view errMsg =
statusToString(static_cast<nvme_mi_resp_status>(rc));
- std::cerr << "[" << ep->describe() << "]"
- << "fail to do nvme identify: " << errMsg << '\n';
+ lg2::error("fail to do nvme identify: {ERROR}", "ENDPOINT",
+ ep->describe(), "ERROR", errMsg.data());
}
auto ex = makeLibNVMeError(errno, rc, "adminIdentify");
if (ex)
{
- std::cerr << "fail to do nvme identify: " << ex->description()
- << '\n';
+ lg2::error("fail to do nvme identify: {ERROR}", "ERROR",
+ ex->description());
}
self->io.post([cb{cb}, ex, data{std::move(data)}]() mutable {
@@ -797,9 +786,10 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << endpoint->describe() << "]" << e.what() << '\n';
+ lg2::error("{ERROR}", "ENDPOINT", endpoint->describe(), "ERROR",
+ e.what());
auto msg = std::string("Runtime error: ") + e.what();
- std::cerr << msg << '\n';
+ lg2::error("{MSG}", "MSG", msg);
io.post([cb{std::move(cb)}, msg]() { cb(makeLibNVMeError(msg), {}); });
return;
}
@@ -826,7 +816,7 @@
rc = nvme_mi_admin_get_log_create_telemetry_host(ctrl, &log);
if (rc != 0)
{
- std::cerr << "failed to create telemetry host log" << '\n';
+ lg2::error("failed to create telemetry host log");
return rc;
}
}
@@ -835,8 +825,8 @@
if (rc != 0)
{
- std::cerr << "failed to retain telemetry log for "
- << (host ? "host" : "ctrl") << '\n';
+ lg2::error("failed to retain telemetry log for {TYPE}", "TYPE",
+ [host] { return host ? "host" : "ctrl"; }());
return rc;
}
@@ -857,9 +847,10 @@
{
if (offset >= data.size())
{
- std::cerr << "[" << device->describe() << "]"
- << "get telemetry log: offset exceed the log size. "
- << "offset: " << offset << ", size: " << data.size() << '\n';
+ lg2::error(
+ "get telemetry log: offset exceed the log size. offset: {OFFSET}, size: {SIZE}",
+ "DEVICE", device->describe(), "OFFSET", offset, "SIZE",
+ data.size());
cb(std::make_error_code(std::errc::invalid_argument), {});
return;
}
@@ -884,9 +875,8 @@
if (rc < 0)
{
- std::cerr << "[" << self->device->describe() << "]"
- << "fail to get chunk for telemetry log: "
- << std::strerror(errno) << '\n';
+ lg2::error("fail to get chunk for telemetry log: {ERROR}", "DEVICE",
+ self->device->describe(), "ERROR", strerror(errno));
boost::asio::post(self->io,
[cb{std::move(cb)}, lastErrno{errno}]() {
cb(std::make_error_code(static_cast<std::errc>(lastErrno)), {});
@@ -897,9 +887,8 @@
{
std::string_view errMsg =
statusToString(static_cast<nvme_mi_resp_status>(rc));
- std::cerr << "[" << self->device->describe() << "]"
- << "fail to get chunk for telemetry log: " << errMsg
- << '\n';
+ lg2::error("fail to get chunk for telemetry log: {ERROR}", "DEVICE",
+ self->device->describe(), "ERROR", errMsg.data());
boost::asio::post(self->io, [cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::bad_message), {});
});
@@ -933,8 +922,8 @@
{
if (auto degraded = isEndpointDegraded())
{
- std::cerr << "[" << device->describe() << "]"
- << " MCTP connection is not established" << '\n';
+ lg2::error("MCTP connection is not established", "DEVICE",
+ device->describe());
io.post(
[cb{std::move(cb)}, errc{degraded.value()}]() { cb(errc, {}); });
return;
@@ -965,8 +954,8 @@
rc = nvme_mi_admin_get_log_error(ctrl, num, false, log);
if (rc != 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get error log" << '\n';
+ lg2::error("fail to get error log", "ENDPOINT",
+ ep->describe());
break;
}
}
@@ -980,8 +969,8 @@
rc = nvme_mi_admin_get_log_smart(ctrl, nsid, false, log);
if (rc != 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get smart log" << '\n';
+ lg2::error("fail to get smart log", "ENDPOINT",
+ ep->describe());
break;
}
}
@@ -1005,8 +994,8 @@
rc = nvme_mi_admin_get_log_fw_slot(ctrl, false, log);
if (rc != 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get firmware slot" << '\n';
+ lg2::error("fail to get firmware slot", "ENDPOINT",
+ ep->describe());
break;
}
}
@@ -1024,9 +1013,8 @@
log);
if (rc != 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get cmd supported and effects log"
- << '\n';
+ lg2::error("fail to get cmd supported and effects log",
+ "ENDPOINT", ep->describe());
break;
}
}
@@ -1040,8 +1028,8 @@
rc = nvme_mi_admin_get_log_device_self_test(ctrl, log);
if (rc != 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get device self test log" << '\n';
+ lg2::error("fail to get device self test log",
+ "ENDPOINT", ep->describe());
break;
}
}
@@ -1056,9 +1044,8 @@
log);
if (rc != 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get changed namespace list"
- << '\n';
+ lg2::error("fail to get changed namespace list",
+ "ENDPOINT", ep->describe());
break;
}
}
@@ -1092,10 +1079,9 @@
int rc = nvme_mi_admin_get_log_lockdown(ctrl, lsp, log);
if (rc != 0)
{
- std::cerr
- << "[" << ep->describe() << "]"
- << "fail to get command and feature lockdown log"
- << '\n';
+ lg2::error(
+ "fail to get command and feature lockdown log",
+ "ENDPOINT", ep->describe());
break;
}
}
@@ -1112,10 +1098,8 @@
log);
if (rc != 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get reservation "
- "notification log"
- << '\n';
+ lg2::error("fail to get reservation notification log",
+ "ENDPOINT", ep->describe());
break;
}
}
@@ -1130,16 +1114,16 @@
int rc = nvme_mi_admin_get_log_sanitize(ctrl, false, log);
if (rc != 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get sanitize status log" << '\n';
+ lg2::error("fail to get sanitize status log",
+ "ENDPOINT", ep->describe());
break;
}
}
break;
default:
{
- std::cerr << "[" << ep->describe() << "]"
- << "unknown lid for GetLogPage" << '\n';
+ lg2::error("unknown lid for GetLogPage", "ENDPOINT",
+ ep->describe());
rc = -1;
errno = EINVAL;
}
@@ -1147,9 +1131,8 @@
if (rc < 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get log page: " << std::strerror(errno)
- << '\n';
+ lg2::error("fail to get log page: {ERROR}", "ENDPOINT",
+ ep->describe(), "ERROR", strerror(errno));
logHandler = [cb{cb}, lastErrno{errno}]() mutable {
cb(std::make_error_code(static_cast<std::errc>(lastErrno)),
{});
@@ -1159,8 +1142,8 @@
{
std::string_view errMsg =
statusToString(static_cast<nvme_mi_resp_status>(rc));
- std::cerr << "[" << ep->describe() << "]"
- << "fail to get log pag: " << errMsg << '\n';
+ lg2::error("fail to get log page: {ERROR}", "ENDPOINT",
+ ep->describe(), "ERROR", errMsg.data());
logHandler = [cb{cb}]() mutable {
cb(std::make_error_code(std::errc::bad_message), {});
};
@@ -1178,8 +1161,8 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << endpoint->describe() << "]"
- << "NVMeMi adminGetLogPage throws: " << e.what() << '\n';
+ lg2::error("NVMeMi adminGetLogPage throws: {ERROR}", "ENDPOINT",
+ endpoint->describe(), "ERROR", e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device), {});
});
@@ -1195,8 +1178,8 @@
{
if (auto degraded = isEndpointDegraded())
{
- std::cerr << "[" << device->describe() << "]"
- << " MCTP connection is not established" << '\n';
+ lg2::error("MCTP connection is not established", "DEVICE",
+ device->describe());
io.post([cb{std::move(cb)}, errc{degraded.value()}]() {
cb(errc, {}, {});
});
@@ -1243,8 +1226,8 @@
if (rc < 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "failed to nvme_mi_admin_xfer" << '\n';
+ lg2::error("failed to nvme_mi_admin_xfer", "ENDPOINT",
+ ep->describe());
self->io.post([cb{std::move(cb)}, lastErrno{errno}]() {
cb(std::make_error_code(static_cast<std::errc>(lastErrno)),
{}, {});
@@ -1268,7 +1251,8 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << endpoint->describe() << "]" << e.what() << '\n';
+ lg2::error("{ERROR}", "ENDPOINT", endpoint->describe(), "ERROR",
+ e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device), {}, {});
});
@@ -1282,8 +1266,8 @@
{
if (auto degraded = isEndpointDegraded())
{
- std::cerr << "[" << device->describe() << "]"
- << " MCTP connection is not established" << '\n';
+ lg2::error("MCTP connection is not established", "DEVICE",
+ device->describe());
io.post([cb{std::move(cb)}, errc{degraded.value()}]() {
cb(errc, nvme_status_field::NVME_SC_MASK);
});
@@ -1302,9 +1286,9 @@
int rc = nvme_mi_admin_fw_commit(ctrl, &args);
if (rc < 0)
{
- std::cerr << "[" << ep->describe() << "]"
- << "fail to nvme_mi_admin_fw_commit: "
- << std::strerror(errno) << '\n';
+ lg2::error("fail to nvme_mi_admin_fw_commit: {ERROR}",
+ "ENDPOINT", ep->describe(), "ERROR",
+ strerror(errno));
self->io.post([cb{std::move(cb)}, lastErrno{errno}]() {
cb(std::make_error_code(static_cast<std::errc>(lastErrno)),
nvme_status_field::NVME_SC_MASK);
@@ -1326,9 +1310,8 @@
default:
std::string_view errMsg = statusToString(
static_cast<nvme_mi_resp_status>(rc));
- std::cerr
- << "fail to nvme_mi_admin_fw_commit: " << errMsg
- << '\n';
+ lg2::error("fail to nvme_mi_admin_fw_commit: {ERROR}",
+ "ERROR", errMsg.data());
self->io.post([rc, cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::bad_message),
static_cast<nvme_status_field>(rc));
@@ -1340,7 +1323,8 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << "[" << endpoint->describe() << "]" << e.what() << '\n';
+ lg2::error("{ERROR}", "ENDPOINT", endpoint->describe(), "ERROR",
+ e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device),
nvme_status_field::NVME_SC_MASK);
@@ -1356,8 +1340,8 @@
{
if (auto degraded = isEndpointDegraded())
{
- std::cerr << "[" << device->describe() << "]"
- << " MCTP connection is not established" << '\n';
+ lg2::error("MCTP connection is not established", "DEVICE",
+ device->describe());
io.post([cb{std::move(cb)}, errc{degraded.value()}]() {
cb(errc, nvme_status_field::NVME_SC_MASK);
});
@@ -1371,8 +1355,8 @@
std::ifstream fwFile(firmwarefile, std::ios::in | std::ios::binary);
if (fwFile.fail())
{
- std::cerr << "fail to open fw image file: " << firmwarefile
- << strerror(errno) << '\n';
+ lg2::error("fail to open fw image file: {FILE}, {ERROR}",
+ "FILE", firmwarefile, "ERROR", strerror(errno));
self->io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(static_cast<std::errc>(errno)),
nvme_status_field::NVME_SC_MASK);
@@ -1398,15 +1382,15 @@
{
if (attemptCount > 0)
{
- std::cout << "Retrying the firmware chunk. With Offset :"
- << offset << " Total firmware Size :" << size
- << '\n';
+ lg2::warning(
+ "Retrying the firmware chunk. With Offset: {OFFSET}, Total firmware Size: {SIZE}",
+ "OFFSET", offset, "SIZE", size);
attemptCount = attemptCount - 1;
}
else
{
- std::cerr << "fail to nvme_mi_admin_fw_download: "
- << std::strerror(errno) << '\n';
+ lg2::error("fail to nvme_mi_admin_fw_download: {ERROR}",
+ "ERROR", strerror(errno));
self->io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(static_cast<std::errc>(errno)),
nvme_status_field::NVME_SC_MASK);
@@ -1421,9 +1405,9 @@
}
if (offset >= size)
{
- std::cout
- << "Successfully transferred the firmware. Transfer Size : "
- << offset << " Total Size :" << size << '\n';
+ lg2::info(
+ "Successfully transferred the firmware. Transfer Size: {XFER}, Total Size: {SIZE}",
+ "XFER", offset, "SIZE", size);
self->io.post([rc, cb{std::move(cb)}]() {
cb({}, static_cast<nvme_status_field>(rc));
});
@@ -1438,7 +1422,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << e.what() << '\n';
+ lg2::error("{ERROR}", "ERROR", e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device),
nvme_status_field::NVME_SC_MASK);
@@ -1457,8 +1441,8 @@
std::ios::in | std::ios::binary | std::ios::ate);
if (imageFile.fail())
{
- std::cerr << "Can't open the firmware file: " << std::strerror(errno)
- << '\n';
+ lg2::error("Can't open the firmware file: {ERROR}", "ERROR",
+ strerror(errno));
io.post([cb{cb}]() {
cb(std::make_error_code(std::errc::no_such_device),
nvme_status_field::NVME_SC_MASK);
@@ -1499,8 +1483,8 @@
});
if (postErr)
{
- std::cerr << "[" << device->describe() << "]"
- << "adminSecuritySend post failed: " << postErr << '\n';
+ lg2::error("adminSecuritySend post failed: {ERROR}", "DEVICE",
+ device->describe(), "ERROR", postErr.message());
io.post([cb{std::move(cb)}, postErr]() { cb(postErr, -1); });
}
}
@@ -1539,9 +1523,9 @@
if (args.data_len > maxNVMeMILength)
{
- std::cerr << "[" << self->device->describe() << "]"
- << "nvme_mi_admin_security_send returned excess data, "
- << args.data_len << '\n';
+ lg2::error(
+ "nvme_mi_admin_security_send returned excess data, {LEN}",
+ "DEVICE", self->device->describe(), "LEN", args.data_len);
self->io.post([cb]() {
cb(std::make_error_code(std::errc::protocol_error), -1, {});
});
@@ -1557,8 +1541,8 @@
});
if (postErr)
{
- std::cerr << "[" << device->describe() << "]"
- << "adminSecurityReceive post failed: " << postErr << '\n';
+ lg2::error("adminSecurityReceive post failed: {ERROR}", "DEVICE",
+ device->describe(), "ERROR", postErr.message());
io.post([cb{std::move(cb)}, postErr]() { cb(postErr, -1, {}); });
}
}
@@ -1585,8 +1569,8 @@
});
if (postErr)
{
- std::cerr << "[" << device->describe() << "]"
- << "adminNonDataCmd post failed: " << postErr << '\n';
+ lg2::error("adminNonDataCmd post failed: {ERROR}", "DEVICE",
+ device->describe(), "ERROR", postErr.message());
io.post([cb{std::move(cb)}, postErr]() { cb(postErr, -1, 0); });
}
}
@@ -1595,7 +1579,7 @@
size_t NVMeMi::getBlockSize(nvme_mi_ctrl_t ctrl, size_t lbaFormat)
{
struct nvme_id_ns id = {};
- std::cout << "getblocksize" << '\n';
+ lg2::debug("getblocksize");
int status = nvme_mi_admin_identify_ns(ctrl, NVME_NSID_ALL, &id);
auto e = makeLibNVMeError(errno, status, "getBlockSize");
if (e)
@@ -1605,7 +1589,8 @@
throw e;
}
- std::cout << "nlbaf " << (int)id.nlbaf << "lbaf " << (int)lbaFormat << '\n';
+ lg2::debug("nlbaf {NLBAF}, lbaf {LBAF}", "NLBAF", (int)id.nlbaf, "LBAF",
+ (int)lbaFormat);
// Sanity check for the value from the drive
size_t maxLbaf = std::min(63, (int)id.nlbaf);
@@ -1629,7 +1614,7 @@
std::function<void(nvme_ex_ptr ex)>&& submittedCb,
std::function<void(nvme_ex_ptr ex, NVMeNSIdentify newid)>&& finishedCb)
{
- std::cout << "createns " << (int)gettid() << '\n';
+ lg2::debug("createns {TID}", "TID", (int)gettid());
std::error_code postErr = tryPost(
[self{shared_from_this()}, ctrl, size, lbaFormat, metadataAtEnd,
submittedCb{submittedCb}, finishedCb{std::move(finishedCb)}]() {
@@ -1679,14 +1664,14 @@
data.ncap = ::htole64(blocks);
data.flbas = flbas;
- std::cout << "verified " << (int)gettid() << '\n';
+ lg2::debug("verified {TID}", "TID", (int)gettid());
// submission has been verified. Handle the cb in main thread
// concurrently.
self->io.post([submittedCb{submittedCb}]() mutable {
submittedCb(nvme_ex_ptr());
});
- std::cout << "after submitted_cb " << (int)gettid() << '\n';
+ lg2::debug("after submitted_cb {TID}", "TID", (int)gettid());
unsigned timeout = nvme_mi_ep_get_timeout(self->nvmeEP);
nvme_mi_ep_set_timeout(self->nvmeEP, namespaceDefaultTimeoutMS);
@@ -1724,12 +1709,12 @@
#endif
});
- std::cout << "submitted cb " << (int)gettid() << '\n';
+ lg2::debug("submitted cb {TID}", "TID", (int)gettid());
if (postErr)
{
- std::cerr << "adminAttachDetachNamespace post failed: " << postErr
- << '\n';
+ lg2::error("createNamespace post failed: {ERROR}", "ERROR",
+ postErr.message());
auto e = makeLibNVMeError(postErr, -1, "createVolume");
io.post([submittedCb{std::move(submittedCb)}, e]() { submittedCb(e); });
}
@@ -1754,7 +1739,8 @@
});
if (postErr)
{
- std::cerr << "deleteNamespace post failed: " << postErr << '\n';
+ lg2::error("deleteNamespace post failed: {ERROR}", "ERROR",
+ postErr.message());
io.post([cb{std::move(cb)}, postErr]() { cb(postErr, -1); });
}
}
@@ -1851,8 +1837,8 @@
});
if (postErr)
{
- std::cerr << "adminAttachDetachNamespace post failed: " << postErr
- << '\n';
+ lg2::error("adminAttachDetachNamespace post failed: {ERROR}", "ERROR",
+ postErr.message());
io.post([cb{std::move(cb)}, postErr]() { cb(postErr, -1); });
}
}
@@ -1875,7 +1861,8 @@
nvme_mi_ep_set_timeout(self->nvmeEP, sanitizeDefaultTimeoutMS);
int status = nvme_mi_admin_sanitize_nvm(ctrl, &args);
nvme_mi_ep_set_timeout(self->nvmeEP, timeout);
- std::cout << "san status " << status << "errno " << errno << '\n';
+ lg2::debug("san status {STATUS}, errno {ERRNO}", "STATUS", status,
+ "ERRNO", errno);
auto ex = makeLibNVMeError(errno, status, "adminSanitize");
self->io.post([cb{cb}, ex]() mutable { cb(ex); });
diff --git a/src/NVMeMiFake.hpp b/src/NVMeMiFake.hpp
index bd13504..ce22761 100644
--- a/src/NVMeMiFake.hpp
+++ b/src/NVMeMiFake.hpp
@@ -2,8 +2,8 @@
#include <boost/asio.hpp>
#include <boost/endian.hpp>
+#include <phosphor-logging/lg2.hpp>
-#include <iostream>
#include <thread>
struct ListNode
@@ -30,8 +30,8 @@
thread = std::thread([&io = workerIO, &stop = workerStop,
&mtx = workerMtx, &cv = workerCv,
&isNotified = workerIsNotified, delay]() {
- std::cerr << "NVMeMiFake worker thread started: " << io.stopped()
- << '\n';
+ lg2::info("NVMeMiFake worker thread started: {STOPPED}", "STOPPED",
+ io.stopped());
// With BOOST_ASIO_DISABLE_THREADS, boost::asio::executor_work_guard
// issues null_event across the thread, which caused invalid
// invokation. We implement a simple invoke machenism based
@@ -44,7 +44,7 @@
std::this_thread::sleep_for(delay);
io.run();
io.restart();
- std::cerr << "job done\n";
+ lg2::info("job done");
{
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [&]() { return isNotified; });
@@ -57,22 +57,22 @@
}
}
}
- std::cerr << "NVMeMi worker this line should not be reached\n";
+ lg2::error("NVMeMi worker this line should not be reached");
});
ctrls.resize(3);
- std::cerr << "NVMeMiFake constructor\n";
+ lg2::info("NVMeMiFake constructor");
}
~NVMeMiFake() override
{
if (valid)
{
- std::cerr << "NVMeMiFake destroyer\n";
+ lg2::info("NVMeMiFake destroyer");
}
else
{
- std::cerr << "NVMeMiFake default destroyer\n";
+ lg2::info("NVMeMiFake default destroyer");
}
// close worker
@@ -109,7 +109,7 @@
{
if (workerStop)
{
- std::cerr << "worker thread for nvme endpoint is stopped\n";
+ lg2::error("worker thread for nvme endpoint is stopped");
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device), {});
@@ -118,7 +118,7 @@
}
post([self{shared_from_this()}, cb = std::move(cb)] {
- std::cerr << "libnvme: scan\n";
+ lg2::info("libnvme: scan");
self->io.post([self{self->shared_from_this()}, cb{cb}]() mutable {
auto& ctrl1 = self->ctrls[0];
auto& ctrl2 = self->ctrls[1];
@@ -145,9 +145,9 @@
[[maybe_unused]] uint32_t nsid, [[maybe_unused]] uint16_t cntid,
std::function<void(nvme_ex_ptr, std::span<uint8_t>)>&& cb) override
{
- std::cerr << "identify\n";
+ lg2::info("identify");
post([self{shared_from_this()}, cb = std::move(cb), cns, nsid]() {
- std::cerr << "libnvme: identify\n";
+ lg2::info("libnvme: identify");
self->io.post([cb{cb}, cns, nsid]() mutable {
std::vector<uint8_t> data;
switch (cns)
@@ -214,8 +214,8 @@
log.lpi = 0x07;
if (rc != 0)
{
- std::cerr
- << "failed to create telemetry host log\n";
+ lg2::error(
+ "failed to create telemetry host log");
throw std::system_error(
errno, std::generic_category());
}
@@ -236,9 +236,8 @@
if (rc != 0)
{
- std::cerr
- << "failed to retain telemetry host "
- "log full log\n";
+ lg2::error(
+ "failed to retain telemetry host log full log");
throw std::system_error(
errno, std::generic_category());
}
@@ -264,7 +263,7 @@
default:
{
- std::cerr << "unknown lid for GetLogPage\n";
+ lg2::error("unknown lid for GetLogPage");
throw std::system_error(std::make_error_code(
std::errc::invalid_argument));
}
@@ -284,7 +283,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << e.what() << '\n';
+ lg2::error("{ERROR}", "ERROR", e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device), {});
});
@@ -308,8 +307,8 @@
int rc = 1;
if (rc < 0)
{
- std::cerr << "fail to subsystem_health_status_poll: "
- << std::strerror(errno) << '\n';
+ lg2::error("fail to subsystem_health_status_poll: {ERROR}",
+ "ERROR", strerror(errno));
self->io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(static_cast<std::errc>(errno)),
nvme_status_field::NVME_SC_MASK);
@@ -330,9 +329,9 @@
default:
std::string_view errMsg = statusToString(
static_cast<nvme_mi_resp_status>(rc));
- std::cerr
- << "fail to subsystem_health_status_poll: "
- << errMsg << '\n';
+ lg2::error(
+ "fail to subsystem_health_status_poll: {ERROR}",
+ "ERROR", errMsg.data());
self->io.post([rc, cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::bad_message),
static_cast<nvme_status_field>(rc));
@@ -344,7 +343,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << e.what() << '\n';
+ lg2::error("{ERROR}", "ERROR", e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device),
nvme_status_field::NVME_SC_MASK);
@@ -392,7 +391,7 @@
if (rc < 0)
{
- std::cerr << "failed to nvme_mi_admin_xfer\n";
+ lg2::error("failed to nvme_mi_admin_xfer");
self->io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(static_cast<std::errc>(errno)),
{}, {});
@@ -425,7 +424,7 @@
}
catch (const std::runtime_error& e)
{
- std::cerr << e.what() << '\n';
+ lg2::error("{ERROR}", "ERROR", e.what());
io.post([cb{std::move(cb)}]() {
cb(std::make_error_code(std::errc::no_such_device), {}, {});
});
@@ -545,7 +544,7 @@
std::unique_lock<std::mutex> lock(workerMtx);
if (!workerStop)
{
- std::cerr << "do post\n";
+ lg2::info("do post");
workerIsNotified = true;
workerIO.post(std::move(func));
workerCv.notify_all();
diff --git a/src/NVMePlugin.cpp b/src/NVMePlugin.cpp
index e450017..702065c 100644
--- a/src/NVMePlugin.cpp
+++ b/src/NVMePlugin.cpp
@@ -7,6 +7,8 @@
#include "NVMeSubsys.hpp"
#include "Utils.hpp"
+#include <phosphor-logging/lg2.hpp>
+
// map from plugin path (subsystem path) to getMetric function
std::unordered_map<std::string,
std::function<std::vector<std::shared_ptr<MetricBase<>>>(
@@ -22,9 +24,8 @@
if (res == subsystem->controllers.end() ||
&controller != res->second.first.get())
{
- std::cerr << ("Failed to create controller plugin: "
- "cannot find the controller")
- << '\n';
+ lg2::error(
+ "Failed to create controller plugin: cannot find the controller");
res->second.second.reset();
return {};
}
diff --git a/src/NVMeSensorMain.cpp b/src/NVMeSensorMain.cpp
index b3a32b5..7189cdb 100644
--- a/src/NVMeSensorMain.cpp
+++ b/src/NVMeSensorMain.cpp
@@ -26,6 +26,7 @@
#include <boost/algorithm/string.hpp>
#include <boost/asio/steady_timer.hpp>
+#include <phosphor-logging/lg2.hpp>
#include <filesystem>
#include <fstream>
@@ -63,19 +64,20 @@
const std::string confPath = "/var/run/nvmed/banned-i2c-bus.conf";
if (!std::filesystem::exists(script))
{
- std::cerr << "Script " << script << " doesn't exist" << '\n';
+ lg2::error("Script {SCRIPT} doesn't exist", "SCRIPT", script);
return;
}
- std::cerr << "Begin to execute " << script << '\n';
+ lg2::info("Begin to execute {SCRIPT}", "SCRIPT", script);
// TODO: (b/376270522) cert-env33-c error: calling 'system' uses a command
// processor
int rc = std::system(script.c_str()); // NOLINT(cert-env33-c)
- std::cerr << "Shell script rc = " << rc << '\n';
+ lg2::info("Shell script rc = {RC}", "RC", rc);
if (!std::filesystem::exists(confPath))
{
- std::cerr << "Warning: " << confPath << " doesn't exist." << '\n';
+ lg2::warning("Warning: {CONF_PATH} doesn't exist.", "CONF_PATH",
+ confPath);
// Be optimistic,assume no bus is banned
return;
}
@@ -83,7 +85,7 @@
file.open(confPath);
if (!file.is_open())
{
- std::cerr << "Error: cannot open " << confPath << '\n';
+ lg2::error("Error: cannot open {CONF_PATH}", "CONF_PATH", confPath);
// Be optimistic,assume no bus is banned
return;
}
@@ -92,7 +94,7 @@
int i2cBus{0};
while (file >> i2cBus)
{
- std::cerr << "Banned i2c bus: " << i2cBus << '\n';
+ lg2::info("Banned i2c bus: {BUS}", "BUS", i2cBus);
bannedBuses.insert(i2cBus);
}
file.close();
@@ -105,7 +107,7 @@
auto findBus = properties.find("Bus");
if (findBus == properties.end())
{
- std::cerr << "could not determine bus number for " << path << "\n";
+ lg2::error("could not determine bus number for '{PATH}'", "PATH", path);
return std::nullopt;
}
@@ -118,7 +120,7 @@
auto findAddr = properties.find("Address");
if (findAddr == properties.end())
{
- std::cerr << "could not determine address for " << path << "\n";
+ lg2::error("could not determine address for '{PATH}'", "PATH", path);
return std::nullopt;
}
@@ -131,8 +133,8 @@
auto findName = properties.find("Name");
if (findName == properties.end())
{
- std::cerr << "could not determine configuration name for " << path
- << "\n";
+ lg2::error("could not determine configuration name for '{PATH}'",
+ "PATH", path);
return std::nullopt;
}
@@ -146,7 +148,8 @@
auto findProtocol = properties.find("Protocol");
if (findProtocol == properties.end())
{
- std::cerr << "could not determine nvme protocl for " << path << "\n";
+ lg2::error("could not determine nvme protocol for '{PATH}'", "PATH",
+ path);
return std::nullopt;
}
return std::get<std::string>(findProtocol->second);
@@ -298,15 +301,15 @@
// I2C directly.
if (!isMctpReactorDevice && !isI2cAccessible)
{
- std::cerr << "Found an mctpd device that isn't I2C accessible,"
- "but it must be: "
- << nvmeObjectPath.str << '\n';
+ lg2::info("Found an mctpd device that isn't I2C accessible,"
+ "but it must be: {PATH}",
+ "PATH", nvmeObjectPath.str);
continue;
}
if (busNumber && bannedBuses.contains(*busNumber))
{
- std::cerr << "Skip banned i2c bus:" << *busNumber << '\n';
+ lg2::info("Skip banned i2c bus: {BUS}", "BUS", *busNumber);
continue;
}
@@ -320,8 +323,8 @@
// protocol because we don't need it for now.
if (*nvmeProtocol == "mi_basic" && !isI2cAccessible)
{
- std::cerr << "Skipping an mi_basic device that's not accessible "
- "over i2c bus.\n";
+ lg2::info("Skipping an mi_basic device that's not accessible "
+ "over i2c bus.");
continue;
}
@@ -342,9 +345,9 @@
}
catch (std::exception& ex)
{
- std::cerr << "Failed to add nvme basic interface for "
- << std::string(nvmeObjectPath) << ": " << ex.what()
- << "\n";
+ lg2::error(
+ "Failed to add nvme basic interface for '{PATH}': {ERROR}",
+ "PATH", nvmeObjectPath.str, "ERROR", ex.what());
continue;
}
}
@@ -413,9 +416,9 @@
}
catch (std::exception& ex)
{
- std::cerr << "Failed to add nvme mi interface for "
- << std::string(nvmeObjectPath) << ": " << ex.what()
- << "\n";
+ lg2::error(
+ "Failed to add nvme mi interface for '{PATH}': {ERROR}",
+ "PATH", nvmeObjectPath.str, "ERROR", ex.what());
continue;
}
}
@@ -466,9 +469,8 @@
}
catch (std::exception& ex)
{
- std::cerr << "Failed to add nvme subsystem for "
- << std::string(interfacePath) << ": " << ex.what()
- << "\n";
+ lg2::error("Failed to add nvme subsystem for '{PATH}': {ERROR}",
+ "PATH", std::string(interfacePath), "ERROR", ex.what());
continue;
}
}
@@ -503,9 +505,8 @@
}
else
{
- std::cerr << "more than one `handleConfigurations` has been "
- "scheduled, cancel the current one"
- << '\n';
+ lg2::error("more than one `handleConfigurations` has been "
+ "scheduled, cancel the current one");
}
});
auto timer = std::make_shared<boost::asio::steady_timer>(
@@ -523,9 +524,8 @@
}
else
{
- std::cerr << "`handleConfigurations` has not been triggered, "
- "cancel the time"
- << '\n';
+ lg2::error("`handleConfigurations` has not been triggered, "
+ "cancel the timer");
}
});
@@ -536,7 +536,7 @@
{
if (message.is_method_error())
{
- std::cerr << "interfacesRemoved callback method error\n";
+ lg2::error("interfacesRemoved callback method error");
return;
}
@@ -566,7 +566,7 @@
{
if (singleWorkerFeature)
{
- std::cerr << "singleWorkerFeature on " << '\n';
+ lg2::info("singleWorkerFeature on");
}
// Load plugin shared libraries
@@ -582,13 +582,14 @@
}
else
{
- std::cerr << "could not load the plugin: " << dlerror() << '\n';
+ lg2::error("could not load the plugin: {ERROR}", "ERROR",
+ dlerror());
}
}
}
catch (const std::filesystem::filesystem_error& e)
{
- std::cerr << "failed to open plugin folder: " << e.what() << '\n';
+ lg2::error("failed to open plugin folder: {ERROR}", "ERROR", e.what());
}
// TODO: set single thread mode according to input parameters
@@ -616,7 +617,7 @@
if (ec)
{
- std::cerr << "Error: " << ec.message() << "\n";
+ lg2::error("Error: {ERROR}", "ERROR", ec.message());
return;
}
@@ -644,8 +645,8 @@
boost::asio::signal_set signals(io, SIGPIPE);
signals.async_wait(
[](const boost::system::error_code& error, int signalNumber) {
- std::cerr << "signal: " << strsignal(signalNumber) << ", "
- << error.message() << '\n';
+ lg2::info("signal: {SIGNAL}, {ERROR}", "SIGNAL",
+ strsignal(signalNumber), "ERROR", error.message());
});
io.run();
diff --git a/src/NVMeSubsys.cpp b/src/NVMeSubsys.cpp
index e2ae09c..0ae9a2f 100644
--- a/src/NVMeSubsys.cpp
+++ b/src/NVMeSubsys.cpp
@@ -183,9 +183,8 @@
findPrimary = controllers.find(secCntlrList->sc_entry[0].pcid);
if (findPrimary == controllers.end())
{
- std::cerr << "fail to match primary controller from "
- "identify sencondary cntrl list"
- << '\n';
+ lg2::error("fail to match primary controller from "
+ "identify secondary cntrl list");
status = Status::Aborting;
markFunctional(false);
markAvailable(false);
@@ -206,9 +205,8 @@
auto findSecondary = controllers.find(secCntlrList->sc_entry[i].scid);
if (findSecondary == controllers.end())
{
- std::cerr << "fail to match secondary controller from "
- "identify sencondary cntrl list"
- << '\n';
+ lg2::error("fail to match secondary controller from "
+ "identify secondary cntrl list");
break;
}
@@ -232,13 +230,12 @@
self->fillDrive(yield);
self->updateVolumes(yield);
self->querySupportedFormats(yield);
- std::cerr << "finished NS enum" << '\n';
+ lg2::info("finished NS enum");
}
catch (const std::exception& e)
{
- std::cerr << std::format("[{}] failed starting the subsystem: {}",
- self->name, e.what())
- << '\n';
+ lg2::error("failed starting the subsystem: {ERROR}", "SUBSYSTEM",
+ self->name, "ERROR", e.what());
self->status = Status::Aborting;
self->markFunctional(false);
self->markAvailable(false);
@@ -354,9 +351,8 @@
if (!posted)
{
- std::cerr
- << "Failed to flush operations, subsystem has stalled!"
- << '\n';
+ lg2::error(
+ "Failed to flush operations, subsystem has stalled!");
}
}
@@ -412,8 +408,9 @@
if (ec || ctrlList.empty())
{
// TODO: mark the subsystem invalid and reschedule refresh
- std::cerr << "fail to scan controllers for the nvme subsystem"
- << (ec ? ": " + ec.message() : "") << '\n';
+ lg2::error(
+ "fail to scan controllers for the nvme subsystem: {ERROR}",
+ "ERROR", ec.message());
self->status = Status::Aborting;
self->markFunctional(false);
self->markAvailable(false);
@@ -451,9 +448,9 @@
}
catch (const std::exception& e)
{
- std::cerr << "failed to create controller: "
- << std::to_string(*index)
- << ", reason: " << e.what() << '\n';
+ lg2::error(
+ "failed to create controller: {CONTROLLER}, reason: {REASON}",
+ "CONTROLLER", *index, "REASON", e.what());
}
index++;
@@ -493,8 +490,7 @@
std::span<uint8_t> data) {
if (ex || data.size() < sizeof(nvme_secondary_ctrl_list))
{
- std::cerr << "fail to identify secondary controller list"
- << '\n';
+ lg2::error("fail to identify secondary controller list");
self->status = Status::Aborting;
self->markFunctional(false);
self->markAvailable(false);
@@ -506,8 +502,7 @@
if (listHdr->num == 0)
{
- std::cerr << "empty identify secondary controller list"
- << '\n';
+ lg2::error("empty identify secondary controller list");
self->status = Status::Aborting;
self->markFunctional(false);
self->markAvailable(false);
@@ -546,8 +541,9 @@
{
if (!primaryController)
{
- std::cerr << "dbus call for inactive NVMe subsystem " << name
- << ". Returning Unavailable\n";
+ lg2::error(
+ "dbus call for inactive NVMe subsystem {SUBSYSTEM}. Returning Unavailable",
+ "SUBSYSTEM", name);
throw sdbusplus::xyz::openbmc_project::Common::Error::Unavailable();
}
return primaryController;
@@ -589,7 +585,8 @@
std::vector<thresholds::Threshold> sensorThresholds;
if (!parseThresholdsFromConfig(config, sensorThresholds))
{
- std::cerr << "error populating thresholds for " << *sensorName << "\n";
+ lg2::error("error populating thresholds for {SENSOR}", "SENSOR",
+ *sensorName);
throw std::runtime_error("error populating thresholds for " +
*sensorName);
}
@@ -606,10 +603,8 @@
auto sensorBase = config.find(configInterfaceName(nvme::sensorType));
if (sensorBase == config.end())
{
- std::cerr << "Warning: " << name
- << ": cannot find sensor config " +
- configInterfaceName(nvme::sensorType)
- << '\n';
+ lg2::warning("cannot find sensor config {CONFIG} for {NAME}", "CONFIG",
+ configInterfaceName(nvme::sensorType), "NAME", name);
}
else
{
@@ -666,8 +661,9 @@
// The device is physically absent
if (error == std::errc::no_such_device)
{
- std::cerr << "error reading ctemp from subsystem"
- << ", reason:" << error.message() << "\n";
+ lg2::error(
+ "error reading ctemp from subsystem, reason: {ERROR}",
+ "ERROR", error.message());
self->markFunctional(false);
self->markAvailable(false);
return;
@@ -675,15 +671,16 @@
// other communication errors
if (error)
{
- std::cerr << "error reading ctemp from subsystem"
- << ", reason:" << error.message() << "\n";
+ lg2::error(
+ "error reading ctemp from subsystem, reason: {ERROR}",
+ "ERROR", error.message());
self->ctemp->incrementError();
return;
}
if (status == nullptr)
{
- std::cerr << "empty data returned by data fetcher" << '\n';
+ lg2::error("empty data returned by data fetcher");
self->markFunctional(false);
return;
}
@@ -694,10 +691,9 @@
((flags & NVMeBasicIntf::StatusFlags::
NVME_MI_BASIC_SFLGS_DRIVE_FUNCTIONAL) == 0))
{
- std::cerr
- << self->name
- << ": health poll returns drive not ready or drive not functional"
- << '\n';
+ lg2::error(
+ "{NAME}: health poll returns drive not ready or drive not functional",
+ "NAME", self->name);
self->markFunctional(false);
return;
}
@@ -728,8 +724,7 @@
// do not poll the health status if the subsystem is intiatilzing
if (self->status == Status::Intiatilzing)
{
- std::cerr << "subsystem is intiatilzing, cancel the health poll"
- << '\n';
+ lg2::info("subsystem is initializing, cancel the health poll");
cb(std::make_error_code(std::errc::operation_canceled),
nullptr);
return;
@@ -749,25 +744,22 @@
if (error == std::errc::operation_canceled)
{
- std::cerr << "processing health data has been cancelled"
- << '\n';
+ lg2::info("processing health data has been cancelled");
return;
}
if (self->status == Status::Intiatilzing)
{
- // on initialization, the subsystem will not update the status.
- std::cerr
- << "subsystem is intiatilzing, do not process the status"
- << '\n';
+ lg2::info(
+ "subsystem is initializing, do not process the status");
return;
}
if (error == std::errc::no_such_device)
{
- std::cerr << "error reading ctemp "
- "from subsystem"
- << ", reason:" << error.message() << "\n";
+ lg2::error(
+ "error reading ctemp from subsystem, reason: {ERROR}",
+ "ERROR", error.message());
// stop the subsystem
self->markFunctional(false);
self->markAvailable(false);
@@ -776,9 +768,9 @@
}
if (error)
{
- std::cerr << "error reading ctemp "
- "from subsystem"
- << ", reason:" << error.message() << "\n";
+ lg2::error(
+ "error reading ctemp from subsystem, reason: {ERROR}",
+ "ERROR", error.message());
self->ctemp->incrementError();
if (self->ctemp->inError())
{
@@ -797,8 +789,8 @@
if (!df)
{
// stop the subsystem
- std::cerr << self->name << ": health poll returns df status 0"
- << '\n';
+ lg2::error("{NAME}: health poll returns df status 0", "NAME",
+ self->name);
self->markFunctional(false);
return;
}
@@ -827,7 +819,7 @@
if (status == Status::Intiatilzing)
{
- std::cerr << "status init" << '\n';
+ lg2::debug("status init");
auto timer = std::make_shared<boost::asio::steady_timer>(
io, std::chrono::milliseconds(100));
timer->async_wait(
@@ -841,7 +833,7 @@
}
else
{
- std::cerr << "status else" << '\n';
+ lg2::debug("status else");
markFunctional(false);
// There's been an explicit request to stop the subsystem. If it has
@@ -904,8 +896,8 @@
auto self = weak.lock();
if (!self)
{
- std::cerr << "createNamespace completed while nvmesensor was "
- "exiting\n";
+ lg2::warning(
+ "createNamespace completed while nvmesensor was exiting");
return;
}
// The NS create has completed (either successfully or not)
@@ -982,8 +974,8 @@
}
catch (const std::exception& e)
{
- std::cerr << "Unhandled error in createVolumeFinished: " << e.what()
- << "\n";
+ lg2::error("Unhandled error in createVolumeFinished: {ERROR}", "ERROR",
+ e.what());
}
}
@@ -1072,7 +1064,7 @@
uint16_t num = ::le16toh(list.num);
if (num == NVME_ID_CTRL_LIST_MAX)
{
- std::cerr << "Warning: full ctrl list returned\n";
+ lg2::warning("full ctrl list returned");
}
for (auto i = 0; i < num; i++)
@@ -1131,9 +1123,10 @@
std::set_difference(existing.begin(), existing.end(), ns.begin(), ns.end(),
std::back_inserter(deletions));
- std::cerr << std::format(
- "[{}] subsystem enum {} NS, {} will be added, {} will be deleted\n",
- name, ns.size(), additions.size(), deletions.size());
+ lg2::info(
+ "[{SUBSYSTEM}] subsystem enum {NS_SIZE} NS, {ADDITIONS} will be added, {DELETIONS} will be deleted",
+ "SUBSYSTEM", name, "NS_SIZE", ns.size(), "ADDITIONS", additions.size(),
+ "DELETIONS", deletions.size());
for (auto n : deletions)
{
@@ -1200,8 +1193,8 @@
{
if (volPath.parent_path() != path + "/volumes")
{
- std::cerr << "getVolume path '" << volPath.str
- << "' doesn't match parent " << path << "\n";
+ lg2::error("getVolume path '{PATH}' doesn't match parent {PARENT_PATH}",
+ "PATH", volPath.str, "PARENT_PATH", path);
return nullptr;
}
@@ -1210,14 +1203,14 @@
auto e = std::from_chars(id.data(), id.data() + id.size(), nsid);
if (e.ptr != id.data() + id.size() || e.ec != std::errc())
{
- std::cerr << "getVolume path '" << volPath.str << "' bad nsid\n";
+ lg2::error("getVolume path '{PATH}' bad nsid", "PATH", volPath.str);
return nullptr;
}
auto v = volumes.find(nsid);
if (v == volumes.end())
{
- std::cerr << "getVolume nsid " << nsid << " not found\n";
+ lg2::error("getVolume nsid {NSID} not found", "NSID", nsid);
return nullptr;
}
@@ -1230,7 +1223,7 @@
if (!controllers.contains(ctrlId))
{
- std::cerr << "attachedVolumes bad controller " << ctrlId << '\n';
+ lg2::error("attachedVolumes bad controller {CTRLID}", "CTRLID", ctrlId);
return vols;
}
@@ -1262,7 +1255,8 @@
throw std::runtime_error(std::format("attachCtrlVolume bad ns {}", ns));
}
attached[c].insert(ns);
- std::cout << name << " attached insert " << c << " " << ns << "\n";
+ lg2::info("{NAME} attached insert {C} {NS}", "NAME", name, "C", c, "NS",
+ ns);
controllers[c].first->updateAssociation();
}
@@ -1283,7 +1277,7 @@
throw std::runtime_error(std::format("detachCtrlVolume bad ns {}", ns));
}
attached[c].erase(ns);
- std::cout << name << " attached erase " << c << " " << ns << "\n";
+ lg2::info("{NAME} attached erase {C} {NS}", "NAME", name, "C", c, "NS", ns);
controllers[c].first->updateAssociation();
}
@@ -1320,7 +1314,7 @@
{
std::string errMsg = std::string("Internal error, NSID exists " +
std::to_string(ns.namespaceId));
- std::cerr << errMsg << "\n";
+ lg2::error("{ERROR}", "ERROR", errMsg);
throw makeLibNVMeError(errMsg);
}
@@ -1398,15 +1392,15 @@
throw std::runtime_error(std::format("{}: Bad nlbaf {}", name, nlbaf));
}
- std::cerr << name << ": Got nlbaf " << nlbaf << "\n";
+ lg2::debug("{NAME}: Got nlbaf {NLBAF}", "NAME", name, "NLBAF", nlbaf);
std::vector<LBAFormat> formats;
for (size_t i = 0; i < nlbaf; i++)
{
size_t blockSize = 1UL << id.lbaf[i].ds;
size_t metadataSize = id.lbaf[i].ms;
RelPerf rp = relativePerformanceFromRP(id.lbaf[i].rp);
- std::cerr << name << ": lbaf " << i << " blocksize " << blockSize
- << "\n";
+ lg2::debug("{NAME}: lbaf {LBAF} blocksize {BLOCKSIZE}", "NAME", name,
+ "LBAF", i, "BLOCKSIZE", blockSize);
formats.push_back({.index = i,
.blockSize = blockSize,
.metadataSize = metadataSize,
@@ -1476,8 +1470,8 @@
{
if (status != Status::Start)
{
- std::cerr << "Subsystem not in Start state, have "
- << static_cast<int>(status) << '\n';
+ lg2::error("Subsystem not in Start state, have {STATUS}", "STATUS",
+ static_cast<int>(status));
return;
}
diff --git a/src/NVMeUtil.hpp b/src/NVMeUtil.hpp
index bc013e5..0f80f65 100644
--- a/src/NVMeUtil.hpp
+++ b/src/NVMeUtil.hpp
@@ -1,9 +1,9 @@
#pragma once
#include <boost/algorithm/string/join.hpp>
#include <boost/asio.hpp>
+#include <phosphor-logging/lg2.hpp>
#include <filesystem>
-#include <iostream>
#include <optional>
#include <system_error>
@@ -36,7 +36,8 @@
size_t dash = rootName.find('-');
if (dash == std::string::npos)
{
- std::cerr << "Error finding root bus for " << rootName << "\n";
+ lg2::error("Error finding root bus for {ROOT_NAME}", "ROOT_NAME",
+ rootName);
return std::nullopt;
}
@@ -161,12 +162,12 @@
{
if (errorCode == boost::asio::error::operation_aborted || timer.expired())
{
- std::cerr << "poll loop has been cancelled\n";
+ lg2::info("poll loop has been cancelled");
return;
}
if (errorCode)
{
- std::cerr << errorCode.message() << "\n";
+ lg2::error("{ERROR}", "ERROR", errorCode.message());
::pollCtemp(std::move(timer), delay, dataFetcher, dataProcessor);
return;
}