diff options
Diffstat (limited to 'phosphor-logging/log.hpp')
-rw-r--r-- | phosphor-logging/log.hpp | 112 |
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 |