| #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()() 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; |
| }; |
| |
| /** @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, |
| path), |
| phosphor::logging::entry( |
| propertyMeta + GetFormat<T>::format, |
| any_ns::any_cast<T>(value))); |
| } |
| }; |
| |
| } // namespace monitoring |
| } // namespace dbus |
| } // namespace phosphor |