diff options
author | Gunnar Mills <gmills@us.ibm.com> | 2017-08-11 09:38:54 -0500 |
---|---|---|
committer | Gunnar Mills <gmills@us.ibm.com> | 2017-08-21 14:26:37 +0000 |
commit | 30474cf5daff8ce4a9fdeeaab63957673eeb9f4b (patch) | |
tree | 1ec5d58ea18601071b67ba926670598799be6c20 /src/elog.hpp | |
parent | d5faea318a83b5e6505715b75855b2fa296b7c99 (diff) | |
download | phosphor-dbus-monitor-30474cf5daff8ce4a9fdeeaab63957673eeb9f4b.tar.gz phosphor-dbus-monitor-30474cf5daff8ce4a9fdeeaab63957673eeb9f4b.zip |
Add support for metadata
Added support for metadata in elog.hpp, elog mako file, and pdmgen.
This metadata will be added with the error log.
Change-Id: Iaf0fe24d71f6bdd02b51df208b2c1d66c68319d3
Signed-off-by: Gunnar Mills <gmills@us.ibm.com>
Diffstat (limited to 'src/elog.hpp')
-rw-r--r-- | src/elog.hpp | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/src/elog.hpp b/src/elog.hpp index f138b0b..e4f5456 100644 --- a/src/elog.hpp +++ b/src/elog.hpp @@ -3,6 +3,7 @@ #include <phosphor-logging/elog.hpp> #include "callback.hpp" #include <sdbusplus/exception.hpp> +#include <experimental/tuple> namespace phosphor { @@ -26,7 +27,7 @@ class ElogBase : public Callback ElogBase& operator=(ElogBase&&) = default; virtual ~ElogBase() = default; ElogBase() : - Callback(){} + Callback() {} /** @brief Callback interface implementation. */ void operator()() override; @@ -36,13 +37,35 @@ class ElogBase : public Callback virtual void log() const = 0; }; +namespace detail +{ + +/** @class CallElog + * @brief Provide explicit call forwarding to phosphor::logging::report. + * + * @tparam T - Error log type + * @tparam Args - Metadata fields types. + */ +template <typename T, typename ...Args> +struct CallElog +{ + static void op(Args&& ...args) + { + phosphor::logging::report<T>(std::forward<Args>(args)...); + } +}; + +} // namespace detail /** @class Elog * @brief C++ type specific logic for the elog callback. + * The elog callback logs the elog and elog metadata. * * @tparam T - Error log type + * @tparam Args - Metadata fields types. + * @param[in] arguments - Metadata fields to be added to the error log */ -template <typename T> +template <typename T, typename ...Args> class Elog : public ElogBase { public: @@ -51,19 +74,34 @@ class Elog : public ElogBase Elog& operator=(const Elog&) = delete; Elog& operator=(Elog&&) = default; ~Elog() = default; - Elog() : - ElogBase() {} + Elog(Args&& ... arguments) : + ElogBase(), args(std::forward<Args>(arguments)...) {} private: /** @brief elog interface implementation. */ void log() const override { - - using namespace phosphor::logging; - report<T>(); + std::experimental::apply( + detail::CallElog<T, Args...>::op, + std::tuple_cat(args)); } + std::tuple<Args...> args; + }; +/** @brief Argument type deduction for constructing Elog instances. + * + * @tparam T - Error log type + * @tparam Args - Metadata fields types. + * @param[in] arguments - Metadata fields to be added to the error log + */ +template <typename T, typename ...Args> +auto makeElog(Args&& ... arguments) +{ + return std::make_unique<Elog<T, Args...>>( + std::forward<Args>(arguments)...); +} + } // namespace monitoring } // namespace dbus } // namespace phosphor |