1
0
mirror of https://github.com/codership/wsrep-lib.git synced 2025-07-15 15:41:49 +03:00

User defined logger callback implementation

Added static wsrep::log::logger_fn() method to allow user to
provide logger callback.
This commit is contained in:
Teemu Ollakka
2018-11-07 21:42:28 +02:00
parent d4efa598bb
commit a942811ce7
3 changed files with 34 additions and 7 deletions

View File

@ -38,6 +38,12 @@ namespace wsrep
warning, warning,
error error
}; };
/**
* Signature for user defined logger callback function.
*/
typedef void (*logger_fn_type)(level, const char*);
static const char* to_c_string(enum level level) static const char* to_c_string(enum level level)
{ {
switch (level) switch (level)
@ -49,21 +55,36 @@ namespace wsrep
}; };
return "unknown"; return "unknown";
} }
log(enum wsrep::log::level level, const char* prefix = "") log(enum wsrep::log::level level, const char* prefix = "")
: level_(level) : level_(level)
, prefix_(prefix) , prefix_(prefix)
, oss_() , oss_()
{ } { }
~log() ~log()
{ {
wsrep::unique_lock<wsrep::mutex> lock(mutex_); if (logger_fn_)
os_ << prefix_ << ": " << oss_.str() << std::endl; {
logger_fn_(level_, oss_.str().c_str());
}
else
{
wsrep::unique_lock<wsrep::mutex> lock(mutex_);
os_ << prefix_ << ": " << oss_.str() << std::endl;
}
} }
template <typename T> template <typename T>
std::ostream& operator<<(const T& val) std::ostream& operator<<(const T& val)
{ {
return (oss_ << val); return (oss_ << val);
} }
/**
* Set user defined logger callback function.
*/
static void logger_fn(logger_fn_type);
private: private:
log(const log&); log(const log&);
log& operator=(const log&); log& operator=(const log&);
@ -72,6 +93,7 @@ namespace wsrep
std::ostringstream oss_; std::ostringstream oss_;
static wsrep::mutex& mutex_; static wsrep::mutex& mutex_;
static std::ostream& os_; static std::ostream& os_;
static logger_fn_type logger_fn_;
}; };
class log_error : public log class log_error : public log

View File

@ -24,3 +24,9 @@
std::ostream& wsrep::log::os_ = std::cout; std::ostream& wsrep::log::os_ = std::cout;
static wsrep::default_mutex log_mutex_; static wsrep::default_mutex log_mutex_;
wsrep::mutex& wsrep::log::mutex_ = log_mutex_; wsrep::mutex& wsrep::log::mutex_ = log_mutex_;
wsrep::log::logger_fn_type wsrep::log::logger_fn_ = 0;
void wsrep::log::logger_fn(wsrep::log::logger_fn_type logger_fn)
{
logger_fn_ = logger_fn;
}

View File

@ -498,20 +498,19 @@ namespace
{ {
case WSREP_LOG_FATAL: case WSREP_LOG_FATAL:
case WSREP_LOG_ERROR: case WSREP_LOG_ERROR:
wsrep::log_error() << "wsrep-lib: " << msg; wsrep::log_error() << msg;
break; break;
case WSREP_LOG_WARN: case WSREP_LOG_WARN:
wsrep::log_warning() << "wsrep-lib: " <<msg; wsrep::log_warning() << msg;
break; break;
case WSREP_LOG_INFO: case WSREP_LOG_INFO:
wsrep::log_info() << "wsrep-lib: " << msg; wsrep::log_info() << msg;
break; break;
case WSREP_LOG_DEBUG: case WSREP_LOG_DEBUG:
wsrep::log_debug() << "wsrep-lib: " << msg; wsrep::log_debug() << msg;
break; break;
} }
} }
} }
wsrep::wsrep_provider_v26::wsrep_provider_v26( wsrep::wsrep_provider_v26::wsrep_provider_v26(