diff --git a/pkg/config/kovri.conf b/pkg/config/kovri.conf index b24287e3..c09b6253 100644 --- a/pkg/config/kovri.conf +++ b/pkg/config/kovri.conf @@ -142,6 +142,17 @@ log-level = 3 log-auto-flush = 0 +# +# Disable console log color +# ========================== +# +# 1 = no color, 0 = color +# +# Default: 0 +# + +log-disable-color = 0 + # # Tunnels Config # ============== diff --git a/src/app/config.cc b/src/app/config.cc index 1d0559d0..0feecbe5 100644 --- a/src/app/config.cc +++ b/src/app/config.cc @@ -98,6 +98,8 @@ void Configuration::ParseKovriConfig() { bpo::value()->default_value(3))( "log-auto-flush", bpo::value()->default_value(false)->value_name("bool"))( + "log-disable-color", + bpo::value()->default_value(false)->value_name("bool"))( "kovriconf,c", bpo::value()->default_value("")->value_name("path"))( "tunnelsconf,t", diff --git a/src/core/util/log.cc b/src/core/util/log.cc index 804b1247..55fd4e60 100644 --- a/src/core/util/log.cc +++ b/src/core/util/log.cc @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -64,12 +65,62 @@ namespace kovri { namespace core { +namespace logging = boost::log; +namespace expr = boost::log::expressions; +namespace attrs = boost::log::attributes; + +std::string SetColor( + logging::value_ref< + logging::trivial::severity_level, + logging::trivial::tag::severity> const& severity, + bool has_color) +{ + if (has_color) + { + if (severity) + { + switch (severity.get()) + { + case logging::trivial::fatal: + case logging::trivial::error: + return "\033[31m"; // Red + case logging::trivial::info: + return "\033[32m"; // Green + case logging::trivial::warning: + return "\033[33m"; // Yellow + case logging::trivial::debug: + return "\033[34m"; // Blue + case logging::trivial::trace: + return "\033[36m"; // Cyan + } + } + return "\033[0m"; // Reset + } + return ""; +} + +logging::formatter GetFormat(bool has_color) +{ + logging::formatter format = + expr::stream + << boost::phoenix::bind( + &SetColor, logging::trivial::severity.or_none(), has_color) + << "[" + << expr::format_date_time( + expr::attr("TimeStamp"), + "%Y.%m.%d %T.%f") + << "]" + << " [" << expr::attr("ThreadID") + << "]" + << " [" << logging::trivial::severity << "]" + << " " << expr::smessage + << (has_color == true ? "\033[0m" : ""); // Reset + return format; +} + void SetupLogging(const boost::program_options::variables_map& kovri_config) { - namespace logging = boost::log; - namespace expr = boost::log::expressions; namespace sinks = boost::log::sinks; - namespace attrs = boost::log::attributes; namespace keywords = boost::log::keywords; // Get global logger // TODO(unassigned): depends on global logging initialization. See notes in log impl @@ -131,19 +182,9 @@ void SetupLogging(const boost::program_options::variables_map& kovri_config) auto file_sink = boost::shared_ptr( std::make_unique(file_backend)); // Set sink formatting - logging::formatter format = - expr::stream << "[" - << expr::format_date_time( - expr::attr("TimeStamp"), - "%Y.%m.%d %T.%f") - << "]" - << " [" << expr::attr( - "ThreadID") - << "]" - << " [" << logging::trivial::severity << "]" - << " " << expr::smessage; - text_sink->set_formatter(format); - file_sink->set_formatter(format); + text_sink->set_formatter( + GetFormat(true && !kovri_config["log-disable-color"].as())); + file_sink->set_formatter(GetFormat(false)); // Add sinks core->add_sink(text_sink); core->add_sink(file_sink);