From 1fe1c16185fa9309ffd13a1478d02e013580a505 Mon Sep 17 00:00:00 2001 From: bergmann Date: Sat, 13 Jul 2019 14:42:56 +0200 Subject: [PATCH] * Added sender type property to log entry --- include/cpplogging/interface/logger.h | 11 +++++++ include/cpplogging/interface/logger.inl | 19 +++++++++++ .../cpplogging/manager/consumer/consumer.inl | 2 +- include/cpplogging/types.h | 15 +++++---- .../manager/consumer/formatting.cpp | 32 ++++++++++++------- 5 files changed, 59 insertions(+), 20 deletions(-) diff --git a/include/cpplogging/interface/logger.h b/include/cpplogging/interface/logger.h index 9118f81..4bb1a72 100644 --- a/include/cpplogging/interface/logger.h +++ b/include/cpplogging/interface/logger.h @@ -70,6 +70,17 @@ namespace cpplogging */ inline log_helper& sender(const void * sender); + /** + * @brief Set the sender and the sender type of the log entry. + */ + template + inline log_helper& sender(const T_sender * sender); + + /** + * @brief Set the sender type of the log entry. + */ + inline log_helper& sender_type(const std::string& sender_type); + /** * @brief Set the filename of the log entry. */ diff --git a/include/cpplogging/interface/logger.inl b/include/cpplogging/interface/logger.inl index c9dcbca..69a633d 100644 --- a/include/cpplogging/interface/logger.inl +++ b/include/cpplogging/interface/logger.inl @@ -1,5 +1,6 @@ #pragma once +#include #include "logger.h" namespace cpplogging @@ -43,6 +44,24 @@ namespace cpplogging return *this; } + template + log_helper& log_helper + ::sender(const T_sender * sender) + { + int status; + auto name = abi::__cxa_demangle(typeid(T_sender).name(), 0, 0, &status); + _entry->sender_type = std::string(name ? name : typeid(T_sender).name()); + _entry->sender = sender; + return *this; + } + + log_helper& log_helper + ::sender_type(const std::string& sender_type) + { + _entry->sender_type = sender_type; + return *this; + } + log_helper& log_helper ::file(const char * file) { diff --git a/include/cpplogging/manager/consumer/consumer.inl b/include/cpplogging/manager/consumer/consumer.inl index 2368f01..75684b9 100644 --- a/include/cpplogging/manager/consumer/consumer.inl +++ b/include/cpplogging/manager/consumer/consumer.inl @@ -13,7 +13,7 @@ namespace cpplogging static const std::string value( "[${runtime:-016.6f}] " "${level:5S} " - "${sender:016x}@${thread:016x} " + "${sender_type}(${sender:016x})@${thread:016x} " "${filename:-25}:${line:5d}$n" "${message}"); return value; diff --git a/include/cpplogging/types.h b/include/cpplogging/types.h index 5057ded..c682b3c 100644 --- a/include/cpplogging/types.h +++ b/include/cpplogging/types.h @@ -27,13 +27,14 @@ namespace cpplogging using clock_type = std::chrono::steady_clock; using uptime_type = clock_type::time_point; - log_level level { log_level::debug }; - uptime_type uptime { clock_type::now() }; - time_t systime { std::time(nullptr) }; - const void* sender { nullptr }; - std::thread::id thread { std::this_thread::get_id() }; - const char* file { nullptr }; - int line { 0 }; + log_level level { log_level::debug }; + uptime_type uptime { clock_type::now() }; + time_t systime { std::time(nullptr) }; + const void* sender { nullptr }; + std::string sender_type { "void" }; + std::thread::id thread { std::this_thread::get_id() }; + const char* file { nullptr }; + int line { 0 }; std::string name; std::string message; }; diff --git a/src/cpplogging/manager/consumer/formatting.cpp b/src/cpplogging/manager/consumer/formatting.cpp index 2639fa3..09ddddc 100644 --- a/src/cpplogging/manager/consumer/formatting.cpp +++ b/src/cpplogging/manager/consumer/formatting.cpp @@ -29,6 +29,7 @@ enum class value_token systime, //!< unix timestamp runtime, //!< runtime of the application sender, //!< sender of the log message + sender_type, //!< type of sender thread, //!< thread id filename, //!< filename only filepath, //!< whole filepath @@ -106,18 +107,19 @@ struct invariant_string_map }; static invariant_string_map value_token_map({ - { "level", value_token::level }, - { "uptime", value_token::uptime }, - { "systime", value_token::systime }, - { "runtime", value_token::runtime }, - { "sender", value_token::sender }, - { "thread", value_token::thread }, - { "filename", value_token::filename }, - { "filepath", value_token::filepath }, - { "line", value_token::line }, - { "name", value_token::name }, - { "message", value_token::message }, - { "newline", value_token::newline }, + { "level", value_token::level }, + { "uptime", value_token::uptime }, + { "systime", value_token::systime }, + { "runtime", value_token::runtime }, + { "sender", value_token::sender }, + { "sender_type", value_token::sender_type }, + { "thread", value_token::thread }, + { "filename", value_token::filename }, + { "filepath", value_token::filepath }, + { "line", value_token::line }, + { "name", value_token::name }, + { "message", value_token::message }, + { "newline", value_token::newline }, }); consumer::format_type consumer::parse_format(const std::string& format) @@ -576,6 +578,12 @@ void consumer::write_formatted(const log_entry& e, const format_type& f, std::os } break; + /* sender_type */ + case value_token::sender_type: + has_line_end = false; + os << e.sender_type; + break; + /* thread */ case value_token::thread: has_line_end = false;