mirror of
				https://github.com/codership/wsrep-lib.git
				synced 2025-11-03 05:33:11 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			165 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * Copyright (C) 2018-2019 Codership Oy <info@codership.com>
 | 
						|
 *
 | 
						|
 * This file is part of wsrep-lib.
 | 
						|
 *
 | 
						|
 * Wsrep-lib is free software: you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation, either version 2 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * Wsrep-lib is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU General Public License
 | 
						|
 * along with wsrep-lib.  If not, see <https://www.gnu.org/licenses/>.
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef WSREP_LOGGER_HPP
 | 
						|
#define WSREP_LOGGER_HPP
 | 
						|
 | 
						|
#include "mutex.hpp"
 | 
						|
#include "lock.hpp"
 | 
						|
#include "atomic.hpp"
 | 
						|
 | 
						|
#include <iosfwd>
 | 
						|
#include <sstream>
 | 
						|
 | 
						|
#define WSREP_LOG_DEBUG(debug_level_fn, debug_level, msg)               \
 | 
						|
    do {                                                                \
 | 
						|
        if (debug_level_fn >= debug_level) wsrep::log_debug() << msg;   \
 | 
						|
    } while (0)
 | 
						|
 | 
						|
namespace wsrep
 | 
						|
{
 | 
						|
    class log
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        enum level
 | 
						|
        {
 | 
						|
            debug,
 | 
						|
            info,
 | 
						|
            warning,
 | 
						|
            error,
 | 
						|
            unknown
 | 
						|
        };
 | 
						|
 | 
						|
        enum debug_level
 | 
						|
        {
 | 
						|
            debug_level_server_state = 1,
 | 
						|
            debug_level_transaction,
 | 
						|
            debug_level_streaming,
 | 
						|
            debug_level_client_state
 | 
						|
        };
 | 
						|
 | 
						|
        /**
 | 
						|
         * Signature for user defined logger callback function.
 | 
						|
         *
 | 
						|
         * @param pfx optional internally defined prefix for the message
 | 
						|
         * @param msg message to log
 | 
						|
         */
 | 
						|
        typedef void (*logger_fn_type)(level l,
 | 
						|
                                       const char* pfx, const char* msg);
 | 
						|
 | 
						|
        static const char* to_c_string(enum level level)
 | 
						|
        {
 | 
						|
            switch (level)
 | 
						|
            {
 | 
						|
            case debug:   return "debug";
 | 
						|
            case info:    return "info";
 | 
						|
            case warning: return "warning";
 | 
						|
            case error:   return "error";
 | 
						|
            case unknown: break;
 | 
						|
            };
 | 
						|
            return "unknown";
 | 
						|
        }
 | 
						|
 | 
						|
        log(enum wsrep::log::level level, const char* prefix = "L:")
 | 
						|
            : level_(level)
 | 
						|
            , prefix_(prefix)
 | 
						|
            , oss_()
 | 
						|
        { }
 | 
						|
 | 
						|
        ~log()
 | 
						|
        {
 | 
						|
            if (logger_fn_)
 | 
						|
            {
 | 
						|
                // Prolong the lifetime of the string so it doesn't get
 | 
						|
                // destroyed right after evaluating c_str() and before
 | 
						|
                // completing the logger function call.
 | 
						|
                const std::string& tmp = oss_.str();
 | 
						|
                logger_fn_(level_, prefix_, tmp.c_str());
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                wsrep::unique_lock<wsrep::mutex> lock(mutex_);
 | 
						|
                os_ << prefix_ << oss_.str() << std::endl;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        template <typename T>
 | 
						|
        std::ostream& operator<<(const T& val)
 | 
						|
        {
 | 
						|
            return (oss_ << val);
 | 
						|
        }
 | 
						|
 | 
						|
        /**
 | 
						|
         * Set user defined logger callback function.
 | 
						|
         */
 | 
						|
        static void logger_fn(logger_fn_type);
 | 
						|
 | 
						|
        /**
 | 
						|
         * Set debug log level from client
 | 
						|
         */
 | 
						|
        static void debug_log_level(int debug_level);
 | 
						|
 | 
						|
        /**
 | 
						|
         * Get current debug log level
 | 
						|
         */
 | 
						|
        static int debug_log_level();
 | 
						|
 | 
						|
    private:
 | 
						|
        log(const log&);
 | 
						|
        log& operator=(const log&);
 | 
						|
        enum level level_;
 | 
						|
        const char* prefix_;
 | 
						|
        std::ostringstream oss_;
 | 
						|
        static wsrep::mutex& mutex_;
 | 
						|
        static std::ostream& os_;
 | 
						|
        static logger_fn_type logger_fn_;
 | 
						|
        static std::atomic_int debug_log_level_;
 | 
						|
    };
 | 
						|
 | 
						|
    class log_error : public log
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        log_error()
 | 
						|
            : log(error) { }
 | 
						|
    };
 | 
						|
 | 
						|
    class log_warning : public log
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        log_warning()
 | 
						|
            : log(warning) { }
 | 
						|
    };
 | 
						|
 | 
						|
    class log_info : public log
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        log_info()
 | 
						|
            : log(info) { }
 | 
						|
    };
 | 
						|
 | 
						|
    class log_debug : public log
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        log_debug()
 | 
						|
            : log(debug) { }
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
#endif // WSREP_LOGGER_HPP
 |