From b2dec03e9b3df59550e598906a76e51bf721afa6 Mon Sep 17 00:00:00 2001 From: Szczepan Zalega Date: Fri, 7 Apr 2017 07:06:13 +0200 Subject: Handle print function in logger by functor Signed-off-by: Szczepan Zalega --- NitrokeyManager.cc | 8 +++++++- include/NitrokeyManager.h | 1 + include/log.h | 12 ++++++++++++ log.cc | 18 ++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index a4ce3a5..3af74ea 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -8,7 +8,7 @@ #include "include/misc.h" #include #include "include/cxx_semantics.h" - +#include namespace nitrokey{ @@ -95,6 +95,12 @@ namespace nitrokey{ return device != nullptr; } + + void NitrokeyManager::set_log_function(std::function log_function){ + static nitrokey::log::FunctionalLogHandler handler(log_function); + nitrokey::log::Log::instance().set_handler(&handler); + } + bool NitrokeyManager::set_default_commands_delay(int delay){ if (delay < 20){ LOG("Delay set too low: " + to_string(delay), Loglevel::WARNING); diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h index a815571..51cd966 100644 --- a/include/NitrokeyManager.h +++ b/include/NitrokeyManager.h @@ -139,6 +139,7 @@ namespace nitrokey { int get_minor_firmware_version(); explicit NitrokeyManager(); + void set_log_function(std::function log_function); private: static shared_ptr _instance; diff --git a/include/log.h b/include/log.h index 38fc122..e7c790a 100644 --- a/include/log.h +++ b/include/log.h @@ -4,6 +4,8 @@ #include #include +#include + namespace nitrokey { namespace log { @@ -29,6 +31,14 @@ namespace nitrokey { virtual void print(const std::string &, Loglevel lvl); }; + class FunctionalLogHandler : public LogHandler { + std::function log_function; + public: + FunctionalLogHandler(std::function _log_function); + virtual void print(const std::string &, Loglevel lvl); + + }; + extern StdlogHandler stdlog_handler; class Log { @@ -56,8 +66,10 @@ namespace nitrokey { #ifdef NO_LOG #define LOG(string, level) while(false){} +#define LOGD(string, level) while(false){} #else #define LOG(string, level) nitrokey::log::Log::instance()((string), (level)) +#define LOGD(string) nitrokey::log::Log::instance()((string), (nitrokey::log::Loglevel::DEBUG_L2)) #endif #endif diff --git a/log.cc b/log.cc index 3370959..84f34d7 100644 --- a/log.cc +++ b/log.cc @@ -4,6 +4,8 @@ #include #include "log.h" +#include + namespace nitrokey { namespace log { @@ -39,5 +41,21 @@ namespace nitrokey { << std::put_time(&tm, "%c %z") << "]\t" << str << std::endl; } + + void FunctionalLogHandler::print(const std::string &str, Loglevel lvl) { + std::time_t t = std::time(nullptr); + std::tm tm = *std::localtime(&t); + + std::stringstream s; + s << "[" << loglevel_to_str(lvl) << "] [" + << std::put_time(&tm, "%c %z") + << "]\t" << str << std::endl; + + log_function(s.str()); + } + + FunctionalLogHandler::FunctionalLogHandler(std::function _log_function) { + log_function = _log_function; + } } } -- cgit v1.2.1