summaryrefslogtreecommitdiffstats
path: root/phosphor-logging/log.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'phosphor-logging/log.hpp')
-rw-r--r--phosphor-logging/log.hpp112
1 files changed, 52 insertions, 60 deletions
diff --git a/phosphor-logging/log.hpp b/phosphor-logging/log.hpp
index 24fa423..14c0faa 100644
--- a/phosphor-logging/log.hpp
+++ b/phosphor-logging/log.hpp
@@ -44,35 +44,6 @@ enum class level
DEBUG = LOG_DEBUG,
};
-/** @fn log()
- * @brief Log message to systemd journal
- * @tparam L - Priority level
- * @param[in] msg - Message to be logged in C-string format
- * @param[in] entry - Metadata fields to be added to the message
- * @details Usage: log<level::XX>(const char*, entry(*format), entry()...);
- * @example log<level::DEBUG>(
- * "Simple Example");
- * char msg_str[] = "File not found";
- * log<level::DEBUG>(
- * msg_str,
- * entry("MY_METADATA=%s_%x, name, number));
- */
-template <level L, typename Msg, typename... Entry>
-void log(Msg msg, Entry... entry);
-
-/** @fn entry()
- * @brief Pack each format string entry as a tuple to be able to validate
- * the string and parameters when multiple entries are passed to be logged.
- * @tparam Arg - Types of first argument
- * @tparam Args - Types of remaining arguments
- * @param[in] arg - First metadata string of form VAR=value where
- * VAR is the variable name in uppercase and
- * value is of any size and format
- * @param[in] args - Remaining metadata strings
- */
-template <typename Arg, typename... Args>
-constexpr auto entry(Arg&& arg, Args&&... args);
-
namespace details
{
@@ -120,24 +91,16 @@ void log(T&& e)
} // namespace details
-template <level L, typename Msg, typename... Entry>
-void log(Msg msg, Entry... e)
+template <class T>
+struct is_char_ptr_argtype
+ : std::integral_constant<
+ bool,
+ (std::is_pointer<typename std::decay<T>::type>::value &&
+ std::is_same<typename std::remove_cv<typename std::remove_pointer<
+ typename std::decay<T>::type>::type>::type,
+ char>::value)>
{
- static_assert((std::is_same<const char*, std::decay_t<Msg>>::value ||
- std::is_same<char*, std::decay_t<Msg>>::value),
- "First parameter must be a C-string.");
-
- constexpr const char* msg_str = "MESSAGE=%s";
- const auto msg_tuple = std::make_tuple(msg_str, std::forward<Msg>(msg));
-
- constexpr auto transactionStr = "TRANSACTION_ID=%lld";
- auto transactionId = sdbusplus::server::transaction::get_id();
-
- auto log_tuple = std::tuple_cat(details::prio<L>(), msg_tuple,
- entry(transactionStr, transactionId),
- std::forward<Entry>(e)...);
- details::log(log_tuple);
-}
+};
template <class T>
struct is_printf_argtype
@@ -151,23 +114,22 @@ struct is_printf_argtype
{
};
-template <class T>
-struct is_char_ptr_argtype
- : std::integral_constant<
- bool,
- (std::is_pointer<typename std::decay<T>::type>::value &&
- std::is_same<typename std::remove_cv<typename std::remove_pointer<
- typename std::decay<T>::type>::type>::type,
- char>::value)>
-{
-};
-
template <bool...>
struct bool_pack;
template <bool... bs>
using all_true = std::is_same<bool_pack<bs..., true>, bool_pack<true, bs...>>;
+/** @fn entry()
+ * @brief Pack each format string entry as a tuple to be able to validate
+ * the string and parameters when multiple entries are passed to be logged.
+ * @tparam Arg - Types of first argument
+ * @tparam Args - Types of remaining arguments
+ * @param[in] arg - First metadata string of form VAR=value where
+ * VAR is the variable name in uppercase and
+ * value is of any size and format
+ * @param[in] args - Remaining metadata strings
+ */
template <typename Arg, typename... Args>
constexpr auto entry(Arg&& arg, Args&&... args)
{
@@ -175,9 +137,39 @@ constexpr auto entry(Arg&& arg, Args&&... args)
"bad argument type: use char*");
static_assert(all_true<is_printf_argtype<Args>::value...>::value,
"bad argument type: use string.c_str() if needed");
- const auto entry_tuple =
- std::make_tuple(std::forward<Arg>(arg), std::forward<Args>(args)...);
- return entry_tuple;
+ return std::make_tuple(std::forward<Arg>(arg), std::forward<Args>(args)...);
+}
+
+/** @fn log()
+ * @brief Log message to systemd journal
+ * @tparam L - Priority level
+ * @param[in] msg - Message to be logged in C-string format
+ * @param[in] entry - Metadata fields to be added to the message
+ * @details Usage: log<level::XX>(const char*, entry(*format), entry()...);
+ * @example log<level::DEBUG>(
+ * "Simple Example");
+ * char msg_str[] = "File not found";
+ * log<level::DEBUG>(
+ * msg_str,
+ * entry("MY_METADATA=%s_%x, name, number));
+ */
+template <level L, typename Msg, typename... Entry>
+void log(Msg msg, Entry... e)
+{
+ static_assert((std::is_same<const char*, std::decay_t<Msg>>::value ||
+ std::is_same<char*, std::decay_t<Msg>>::value),
+ "First parameter must be a C-string.");
+
+ constexpr const char* msg_str = "MESSAGE=%s";
+ const auto msg_tuple = std::make_tuple(msg_str, std::forward<Msg>(msg));
+
+ constexpr auto transactionStr = "TRANSACTION_ID=%lld";
+ auto transactionId = sdbusplus::server::transaction::get_id();
+
+ auto log_tuple = std::tuple_cat(details::prio<L>(), msg_tuple,
+ entry(transactionStr, transactionId),
+ std::forward<Entry>(e)...);
+ details::log(log_tuple);
}
} // namespace logging
OpenPOWER on IntegriCloud