diff --git a/include/wsrep/logger.hpp b/include/wsrep/logger.hpp index 72ac8c9..d1b6ad8 100644 --- a/include/wsrep/logger.hpp +++ b/include/wsrep/logger.hpp @@ -38,6 +38,12 @@ namespace wsrep warning, 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) { switch (level) @@ -49,21 +55,36 @@ namespace wsrep }; return "unknown"; } + log(enum wsrep::log::level level, const char* prefix = "") : level_(level) , prefix_(prefix) , oss_() { } + ~log() { - wsrep::unique_lock lock(mutex_); - os_ << prefix_ << ": " << oss_.str() << std::endl; + if (logger_fn_) + { + logger_fn_(level_, oss_.str().c_str()); + } + else + { + wsrep::unique_lock lock(mutex_); + os_ << prefix_ << ": " << oss_.str() << std::endl; + } } + template std::ostream& operator<<(const T& val) { return (oss_ << val); } + + /** + * Set user defined logger callback function. + */ + static void logger_fn(logger_fn_type); private: log(const log&); log& operator=(const log&); @@ -72,6 +93,7 @@ namespace wsrep std::ostringstream oss_; static wsrep::mutex& mutex_; static std::ostream& os_; + static logger_fn_type logger_fn_; }; class log_error : public log diff --git a/src/logger.cpp b/src/logger.cpp index 694d470..65ad9ab 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -24,3 +24,9 @@ std::ostream& wsrep::log::os_ = std::cout; static wsrep::default_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; +} diff --git a/src/wsrep_provider_v26.cpp b/src/wsrep_provider_v26.cpp index 027c76e..eb00263 100644 --- a/src/wsrep_provider_v26.cpp +++ b/src/wsrep_provider_v26.cpp @@ -498,20 +498,19 @@ namespace { case WSREP_LOG_FATAL: case WSREP_LOG_ERROR: - wsrep::log_error() << "wsrep-lib: " << msg; + wsrep::log_error() << msg; break; case WSREP_LOG_WARN: - wsrep::log_warning() << "wsrep-lib: " <