#include #include #include #include #include #include #ifndef WIN32 #include #endif #include #define COLOR_CONSOLE 1 #include "console_defines.h" #include #include #include #include #include namespace fc { class console_appender::impl { public: config cfg; color::type lc[log_level::off+1]; #ifdef WIN32 HANDLE console_handle; #endif }; console_appender::console_appender( const variant& args ) :my(new impl) { configure( args.as(LOG_MAX_OBJECT_DEPTH) ); } console_appender::console_appender( const config& cfg ) :my(new impl) { configure( cfg ); } console_appender::console_appender() :my(new impl){} void console_appender::configure( const config& console_appender_config ) { try { #ifdef WIN32 my->console_handle = INVALID_HANDLE_VALUE; #endif my->cfg = console_appender_config; #ifdef WIN32 if (my->cfg.stream = stream::std_error) my->console_handle = GetStdHandle(STD_ERROR_HANDLE); else if (my->cfg.stream = stream::std_out) my->console_handle = GetStdHandle(STD_OUTPUT_HANDLE); #endif for( int i = 0; i < log_level::off+1; ++i ) my->lc[i] = color::console_default; for( auto itr = my->cfg.level_colors.begin(); itr != my->cfg.level_colors.end(); ++itr ) my->lc[itr->level] = itr->color; } FC_CAPTURE_AND_RETHROW( (console_appender_config) ) } console_appender::~console_appender() {} #ifdef WIN32 static WORD #else static const char* #endif get_console_color(console_appender::color::type t ) { switch( t ) { case console_appender::color::red: return CONSOLE_RED; case console_appender::color::green: return CONSOLE_GREEN; case console_appender::color::brown: return CONSOLE_BROWN; case console_appender::color::blue: return CONSOLE_BLUE; case console_appender::color::magenta: return CONSOLE_MAGENTA; case console_appender::color::cyan: return CONSOLE_CYAN; case console_appender::color::white: return CONSOLE_WHITE; case console_appender::color::console_default: default: return CONSOLE_DEFAULT; } } boost::mutex& log_mutex() { static boost::mutex m; return m; } void console_appender::log( const log_message& m ) { FILE* out = stream::std_error ? stderr : stdout; std::stringstream file_line; file_line << m.get_context().get_file() <<":"<cfg.max_object_depth ); line << message; fc::unique_lock lock(log_mutex()); print( line.str(), my->lc[m.get_context().get_log_level()] ); fprintf( out, "\n" ); if( my->cfg.flush ) fflush( out ); } void console_appender::print( const std::string& text, color::type text_color ) { FILE* out = stream::std_error ? stderr : stdout; #ifdef WIN32 if (my->console_handle != INVALID_HANDLE_VALUE) SetConsoleTextAttribute(my->console_handle, get_console_color(text_color)); #else if(isatty(fileno(out))) fprintf( out, "\r%s", get_console_color( text_color ) ); #endif if( text.size() ) fprintf( out, "%s", text.c_str() ); //fmt_str.c_str() ); #ifdef WIN32 if (my->console_handle != INVALID_HANDLE_VALUE) SetConsoleTextAttribute(my->console_handle, CONSOLE_DEFAULT); #else if(isatty(fileno(out))) fprintf( out, "\r%s", CONSOLE_DEFAULT ); #endif if( my->cfg.flush ) fflush( out ); } }