// // logger.hpp // logger // // Created by Sam Jaffe on 9/3/16. // #pragma once // // Logger.hpp // DanmakuRPG // // Created by Sam Jaffe on 7/18/15. // Copyright (c) 2015 Sam Jaffe. All rights reserved. // #pragma once #include #include #include #include #include #include "logger_fwd.hpp" #include "format.hpp" #define log_message( logger, level, ... ) logger.log( level, { __FILE__, __LINE__, STRING( FUNCTION ) }, __VA_ARGS__ ) namespace logging { class ilogger_impl; typedef ilogger_impl& (*_binding)(void); bool bind_logger_impl(_binding impl); const char* level_header(ilog_level); class ilogger { public: static ilogger& instance(); static ilogger& instance(std::string const & key); public: template inline void log(ilog_level ll, std::string const & interp, Args && ...args) { log( ll, location_info{}, interp, std::forward(args)... ); } template inline void log(ilog_level ll, location_info info, std::string const & interp, Args && ...args) { if ( should_log( ll ) ) { log( ll, info, format_msg( interp, std::forward(args)... ) ); } } void flush(); ~ilogger(); private: bool should_log( ilog_level ) const; void log( ilog_level ll, location_info info, std::string const& ); explicit ilogger(std::string const & name = ""); ilogger(ilogger const&); ilogger& operator=(ilogger const&); ilog_level min_level_; std::string const logger_name_; ilogger_impl& impl_; }; class ilogger_impl { public: bool should_log( ilog_level ll ) const; virtual void write( logpacket const & pkt ) = 0; virtual void flush() = 0; virtual ~ilogger_impl() = default; private: ilog_level min_log_level; }; }