blob: c9c2d8b8d05dd212ca4aebad6b865f121a3f8e9d [file] [log] [blame]
#pragma once
#include "callback.hpp"
#include "format.hpp"
#include <phosphor-logging/log.hpp>
#include <string>
namespace phosphor
{
namespace dbus
{
namespace monitoring
{
/** @class JournalBase
* @brief Journal callback implementation.
*
* The journal callback logs the client message and
* journal metadata key value pairs as specified by the
* client supplied property index.
*/
class JournalBase : public IndexedCallback
{
public:
JournalBase() = delete;
JournalBase(const JournalBase&) = delete;
JournalBase(JournalBase&&) = default;
JournalBase& operator=(const JournalBase&) = delete;
JournalBase& operator=(JournalBase&&) = default;
virtual ~JournalBase() = default;
JournalBase(const char* msg, const PropertyIndex& index) :
IndexedCallback(index), message(msg)
{}
/** @brief Callback interface implementation. */
void operator()(Context ctx) override;
private:
/** @brief Delegate type specific calls to subclasses. */
virtual void log(const char* message, const std::string& pathMeta,
const std::string& path, const std::string& propertyMeta,
const std::any& value) const = 0;
/** @brief The client provided message to be traced. */
const char* message;
};
/** @struct Display
* @brief Convert strings to const char*.
*/
namespace detail
{
template <typename T>
struct Display
{
static auto op(T&& value)
{
return std::forward<T>(value);
}
};
template <>
struct Display<std::string>
{
static auto op(const std::string& value)
{
return value.c_str();
}
};
} // namespace detail
/** @class Journal
* @brief C++ type specific logic for the journal callback.
*
* @tparam T - The C++ type of the property values being traced.
* @tparam Severity - The log severity of the log entry.
*/
template <typename T, phosphor::logging::level Severity>
class Journal : public JournalBase
{
public:
Journal() = delete;
Journal(const Journal&) = delete;
Journal(Journal&&) = default;
Journal& operator=(const Journal&) = delete;
Journal& operator=(Journal&&) = default;
~Journal() = default;
Journal(const char* msg, const PropertyIndex& index) :
JournalBase(msg, index)
{}
private:
/** @brief log interface implementation. */
void log(const char* message, const std::string& pathMeta,
const std::string& path, const std::string& propertyMeta,
const std::any& value) const override
{
phosphor::logging::log<Severity>(
message,
phosphor::logging::entry(
(pathMeta + GetFormat<decltype(pathMeta)>::format).c_str(),
path.c_str()),
phosphor::logging::entry(
(propertyMeta + GetFormat<T>::format).c_str(),
detail::Display<T>::op(std::any_cast<T>(value))));
}
};
} // namespace monitoring
} // namespace dbus
} // namespace phosphor