@@ -5,6 +5,6 @@ | |||||
#define cpplogging_global_log(p_level) \ | #define cpplogging_global_log(p_level) \ | ||||
if (::cpplogging::logger::get().is_enabled(::cpplogging::log_level::p_level)) \ | if (::cpplogging::logger::get().is_enabled(::cpplogging::log_level::p_level)) \ | ||||
::cpplogging::logger::get().log() \ | ::cpplogging::logger::get().log() \ | ||||
.level(::cpplogging::log_level::p_level) \ | |||||
.file(__FILE__) \ | |||||
.line(__LINE__) | |||||
<< ::cpplogging::level(::cpplogging::log_level::p_level) \ | |||||
<< ::cpplogging::file(__FILE__) \ | |||||
<< ::cpplogging::line(__LINE__) |
@@ -32,7 +32,7 @@ namespace cpplogging | |||||
* @brief Set the sender of a log stream. | * @brief Set the sender of a log stream. | ||||
*/ | */ | ||||
template<typename T_sender> | template<typename T_sender> | ||||
inline auto sender(const T_sender * sender); | |||||
inline auto sender(const T_sender* sender); | |||||
/** | /** | ||||
* @brief Set the sender type of a log stream. | * @brief Set the sender type of a log stream. | ||||
@@ -33,7 +33,7 @@ namespace cpplogging | |||||
} | } | ||||
template<typename T_sender> | template<typename T_sender> | ||||
auto sender(const T_sender * sender) | |||||
auto sender(const T_sender* sender) | |||||
{ | { | ||||
return __impl::make_stream_setter([=](log_entry& e){ | return __impl::make_stream_setter([=](log_entry& e){ | ||||
int status; | int status; | ||||
@@ -6,9 +6,9 @@ | |||||
#define cpplogging_log(p_logger, p_level) \ | #define cpplogging_log(p_logger, p_level) \ | ||||
if (p_logger.is_enabled(::cpplogging::log_level::p_level)) \ | if (p_logger.is_enabled(::cpplogging::log_level::p_level)) \ | ||||
p_logger.log() \ | p_logger.log() \ | ||||
.level(::cpplogging::log_level::p_level) \ | |||||
.file(__FILE__) \ | |||||
.line(__LINE__) | |||||
<< ::cpplogging::level(::cpplogging::log_level::p_level) \ | |||||
<< ::cpplogging::file(__FILE__) \ | |||||
<< ::cpplogging::line(__LINE__) | |||||
namespace cpplogging | namespace cpplogging | ||||
{ | { | ||||
@@ -59,72 +59,6 @@ namespace cpplogging | |||||
* @brief Destructor. Will finally write the log entry. | * @brief Destructor. Will finally write the log entry. | ||||
*/ | */ | ||||
inline ~log_helper(); | inline ~log_helper(); | ||||
/** | |||||
* @brief Set the log level of the entry, | |||||
*/ | |||||
inline log_helper& level(log_level level); | |||||
/** | |||||
* @brief Set the sender of the log entry. | |||||
*/ | |||||
inline log_helper& sender(const void * sender); | |||||
/** | |||||
* @brief Set the sender and the sender type of the log entry. | |||||
*/ | |||||
template<typename T_sender> | |||||
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. | |||||
*/ | |||||
inline log_helper& file(const char * file); | |||||
/** | |||||
* @brief Set the line number of the log entry. | |||||
*/ | |||||
inline log_helper& line(int line); | |||||
/** | |||||
* @brief Set the message of the log entry. | |||||
*/ | |||||
inline log_helper& message(const std::string& msg); | |||||
/** | |||||
* @brief Add the passed string to the log message. | |||||
*/ | |||||
inline log_helper& add_message(const std::string& msg); | |||||
/** | |||||
* @brief Set the message of the entry using format string. | |||||
*/ | |||||
template<typename... T_args> | |||||
inline log_helper& format(const std::string& fmt, T_args&&... args); | |||||
/** | |||||
* @brief Add a message to the entry using format string. | |||||
*/ | |||||
template<typename... T_args> | |||||
inline log_helper& add_format(const std::string& fmt, T_args&&... args); | |||||
private: | |||||
/** | |||||
* @brief Format a string. | |||||
* | |||||
* @tparam T_args Arguments of the format string. | |||||
* | |||||
* @param[in] fmt Format string. | |||||
* @param[in] sz Size of the buffer to use for the formatting. | |||||
* @param[in] args Arguments of the format. | |||||
*/ | |||||
template<typename... T_args> | |||||
static inline std::string format(const std::string& fmt, size_t sz, T_args&&... args); | |||||
}; | }; | ||||
} | } | ||||
@@ -27,96 +27,9 @@ namespace cpplogging | |||||
::~log_helper() | ::~log_helper() | ||||
{ | { | ||||
entry->message += str(); | entry->message += str(); | ||||
logger.write_entry(entry); | |||||
if (entry.use_count() == 1) | |||||
logger.write_entry(entry); | |||||
} | } | ||||
log_helper& log_helper | |||||
::level(log_level level) | |||||
{ | |||||
entry->level = level; | |||||
return *this; | |||||
} | |||||
log_helper& log_helper | |||||
::sender(const void * sender) | |||||
{ | |||||
entry->sender = sender; | |||||
return *this; | |||||
} | |||||
template<typename T_sender> | |||||
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) | |||||
{ | |||||
entry->file = file; | |||||
return *this; | |||||
} | |||||
log_helper& log_helper | |||||
::line(int line) | |||||
{ | |||||
entry->line = line; | |||||
return *this; | |||||
} | |||||
log_helper& log_helper | |||||
::message(const std::string& msg) | |||||
{ | |||||
entry->message = msg; | |||||
return *this; | |||||
} | |||||
log_helper& log_helper | |||||
::add_message(const std::string& msg) | |||||
{ | |||||
entry->message += msg; | |||||
return *this; | |||||
} | |||||
template<typename... T_args> | |||||
log_helper& log_helper | |||||
::format(const std::string& fmt, T_args&&... args) | |||||
{ | |||||
entry->message = format(fmt, 0x8000, std::forward<T_args>(args)...); | |||||
return *this; | |||||
} | |||||
template<typename... T_args> | |||||
log_helper& log_helper | |||||
::add_format(const std::string& fmt, T_args&&... args) | |||||
{ | |||||
entry->message += format(fmt, 0x8000, std::forward<T_args>(args)...); | |||||
return *this; | |||||
} | |||||
template<typename... T_args> | |||||
std::string log_helper | |||||
::format(const std::string& fmt, size_t sz, T_args&&... args) | |||||
{ | |||||
std::unique_ptr<char, decltype(&free)> buff(static_cast<char*>(malloc(sz)), &free); | |||||
auto len = snprintf(buff.get(), sz, fmt.c_str(), std::forward<T_args>(args)...); | |||||
if (len < 0) | |||||
throw std::runtime_error("unable to format string"); | |||||
return std::string(buff.get(), len); | |||||
} | |||||
} | } | ||||
/* logger */ | /* logger */ | ||||
@@ -8,7 +8,7 @@ matcher_regex::matcher_regex(const std::string regex, bool invert) | |||||
{ } | { } | ||||
bool matcher_regex::match(const logger& logger) const | bool matcher_regex::match(const logger& logger) const | ||||
{ return !logger.name().empty() && std::regex_match(logger.name(), _regex) != _invert; } | |||||
{ return std::regex_match(logger.name(), _regex) != _invert; } | |||||
bool matcher_regex::match(const consumer& consumer) const | bool matcher_regex::match(const consumer& consumer) const | ||||
{ return !consumer.name().empty() && std::regex_match(consumer.name(), _regex) != _invert; } | |||||
{ return std::regex_match(consumer.name(), _regex) != _invert; } |
@@ -128,6 +128,33 @@ TEST(LoggingTests, log_base) | |||||
cpplogging_log(l1, error).sender((void*)0x24).message("test2") << " error"; | cpplogging_log(l1, error).sender((void*)0x24).message("test2") << " error"; | ||||
} | } | ||||
TEST(LoggingTests, log_inverted_regex) | |||||
{ | |||||
LoggingReset loggingReset; | |||||
StrictMock<consumer_mock> c0("consumer0"); | |||||
EXPECT_CALL(c0, write_entry(MatchLogData( | |||||
log_level::debug, | |||||
(void*)0x12, | |||||
std::this_thread::get_id(), | |||||
std::string("logger2"), | |||||
std::string("test2")))); | |||||
manager::define_rule( | |||||
std::make_unique<matcher_regex>("^logger[0-1]+$", true), | |||||
std::make_unique<matcher_regex>("consumer0"), | |||||
log_level::debug, | |||||
log_level::error); | |||||
auto& l0 = logger::get("logger0"); | |||||
auto& l1 = logger::get("logger1"); | |||||
auto& l2 = logger::get("logger2"); | |||||
cpplogging_log(l0, debug).sender((void*)0x10) << "test0"; | |||||
cpplogging_log(l1, debug).sender((void*)0x11) << "test1"; | |||||
cpplogging_log(l2, debug).sender((void*)0x12) << "test2"; | |||||
} | |||||
#ifdef CPPLOGGING_HAS_LOAD_CONFIG | #ifdef CPPLOGGING_HAS_LOAD_CONFIG | ||||
TEST(LoggingTests, load) | TEST(LoggingTests, load) | ||||
{ | { | ||||