#include #include #include #include #include #include #ifndef WIN32 #include #endif #include #define COLOR_CONSOLE 1 #include "console_defines.h" #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) { #ifdef WIN32 my->console_handle = INVALID_HANDLE_VALUE; #endif try { my->cfg = args.as();//fc::variant_cast(args); #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; } catch ( exception& e ) { fc::cerr< lock(log_mutex()); #ifdef WIN32 if (my->console_handle != INVALID_HANDLE_VALUE) SetConsoleTextAttribute(my->console_handle, get_console_color( my->lc[m.get_context().get_log_level()] )); #else if(isatty(fileno(out))) fprintf( out, "\r%s", get_console_color( my->lc[m.get_context().get_log_level()] ) ); #endif fprintf( out, "%s", line.str().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 fprintf( out, "\n" ); if( my->cfg.flush ) fflush( out ); } }