| #pragma once |
| |
| #include <phosphor-logging/log.hpp> |
| #include "callback.hpp" |
| #include "format.hpp" |
| |
| 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 any_ns::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 any_ns::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(any_ns::any_cast<T>(value)))); |
| } |
| }; |
| |
| } // namespace monitoring |
| } // namespace dbus |
| } // namespace phosphor |