#include #include #include #include #include #include #include #include #include #include #include namespace fc { extern std::unordered_map& get_logger_map(); extern std::unordered_map& get_appender_map(); logger_config& logger_config::add_appender( const string& s ) { appenders.push_back(s); return *this; } void configure_logging( const fc::path& lc ) { configure_logging( fc::json::from_file(lc) ); } bool configure_logging( const logging_config& cfg ) { try { static bool reg_console_appender = appender::register_appender( "console" ); static bool reg_file_appender = appender::register_appender( "file" ); get_logger_map().clear(); get_appender_map().clear(); //slog( "\n%s", fc::json::to_pretty_string(cfg).c_str() ); for( size_t i = 0; i < cfg.appenders.size(); ++i ) { appender::create( cfg.appenders[i].name, cfg.appenders[i].type, cfg.appenders[i].args ); // TODO... process enabled } for( size_t i = 0; i < cfg.loggers.size(); ++i ) { auto lgr = logger::get( cfg.loggers[i].name ); // TODO: finish configure logger here... if( cfg.loggers[i].parent.valid() ) { lgr.set_parent( logger::get( *cfg.loggers[i].parent ) ); } lgr.set_name(cfg.loggers[i].name); if( cfg.loggers[i].level.valid() ) lgr.set_log_level( *cfg.loggers[i].level ); for( auto a = cfg.loggers[i].appenders.begin(); a != cfg.loggers[i].appenders.end(); ++a ){ auto ap = appender::get( *a ); if( ap ) { lgr.add_appender(ap); } } } return reg_console_appender || reg_file_appender; } catch ( exception& e ) { fc::cerr<