diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 821762521..08e51171f 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1212,13 +1212,6 @@ language (Language) enum ,be,ca,cs,da,de,dv,en,eo,es,et,fr,he,hu,id,it,ja,jbo, # - verbose debug_log_level (Debug log level) enum action ,none,error,warning,action,info,verbose -# ANSI colored logs: red error log, yellow warning and grey info and verbose logs -# Note that it doesn't work on Windows -# "yes" always enables it, -# "detect" enables it when printing to terminal and -# "no" disables it -log_color (Colored logs) enum detect yes,detect,no - # IPv6 support. enable_ipv6 (IPv6) bool true diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 0d1b3aa86..586408dcf 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -351,7 +351,6 @@ void set_default_settings(Settings *settings) settings->setDefault("ignore_world_load_errors", "false"); settings->setDefault("remote_media", ""); settings->setDefault("debug_log_level", "action"); - settings->setDefault("log_color", "detect"); settings->setDefault("emergequeue_limit_total", "256"); settings->setDefault("emergequeue_limit_diskonly", "32"); settings->setDefault("emergequeue_limit_generate", "32"); diff --git a/src/log.cpp b/src/log.cpp index 3e9229e38..c84a847a5 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -251,6 +251,8 @@ const std::string Logger::getLevelLabel(LogLevel lev) return names[lev]; } +LogColor Logger::color_mode = LOG_COLOR_AUTO; + const std::string Logger::getThreadName() { std::map::const_iterator it; diff --git a/src/log.h b/src/log.h index 506137739..952ebadb1 100644 --- a/src/log.h +++ b/src/log.h @@ -28,7 +28,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #if !defined(_WIN32) // POSIX #include #endif -#include "settings.h" #include "irrlichttypes.h" class ILogOutput; @@ -43,6 +42,12 @@ enum LogLevel { LL_MAX, }; +enum LogColor { + LOG_COLOR_NEVER, + LOG_COLOR_ALWAYS, + LOG_COLOR_AUTO, +}; + typedef u8 LogLevelMask; #define LOGLEVEL_TO_MASKLEVEL(x) (1 << x) @@ -68,6 +73,8 @@ public: static LogLevel stringToLevel(const std::string &name); static const std::string getLevelLabel(LogLevel lev); + static LogColor color_mode; + private: void logToOutputsRaw(LogLevel, const std::string &line); void logToOutputs(LogLevel, const std::string &combined, @@ -111,18 +118,17 @@ public: m_stream(stream) { #if !defined(_WIN32) - is_tty = isatty(fileno(stdout)); + colored = (Logger::color_mode == LOG_COLOR_ALWAYS) || + (Logger::color_mode == LOG_COLOR_AUTO && isatty(fileno(stdout))); #else - is_tty = false; + colored = Logger::color_mode == LOG_COLOR_ALWAYS; #endif } void logRaw(LogLevel lev, const std::string &line) { - static const std::string use_logcolor = g_settings->get("log_color"); - - bool colored = use_logcolor == "detect" ? is_tty : use_logcolor == "yes"; - if (colored) + bool colored_message = colored; + if (colored_message) switch (lev) { case LL_ERROR: // error is red @@ -142,19 +148,19 @@ public: break; default: // action is white - colored = false; + colored_message = false; } m_stream << line << std::endl; - if (colored) + if (colored_message) // reset to white color m_stream << "\033[0m"; } private: std::ostream &m_stream; - bool is_tty; + bool colored; }; class FileLogOutput : public ICombinedLogOutput { diff --git a/src/main.cpp b/src/main.cpp index 7f9f0967e..d9073cfb8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -266,6 +266,15 @@ static void set_allowed_options(OptionList *allowed_options) "'name' lists names, 'both' lists both)")))); allowed_options->insert(std::make_pair("quiet", ValueSpec(VALUETYPE_FLAG, _("Print to console errors only")))); +#if !defined(_WIN32) + allowed_options->insert(std::make_pair("color", ValueSpec(VALUETYPE_STRING, + _("Coloured logs ('always', 'never' or 'auto'), defaults to 'auto'" + )))); +#else + allowed_options->insert(std::make_pair("color", ValueSpec(VALUETYPE_STRING, + _("Coloured logs ('always' or 'never'), defaults to 'never'" + )))); +#endif allowed_options->insert(std::make_pair("info", ValueSpec(VALUETYPE_FLAG, _("Print more information to console")))); allowed_options->insert(std::make_pair("verbose", ValueSpec(VALUETYPE_FLAG, @@ -393,6 +402,17 @@ static void setup_log_params(const Settings &cmd_args) g_logger.addOutputMaxLevel(&stderr_output, LL_ERROR); } + // Coloured log messages (see log.h) + if (cmd_args.exists("color")) { + std::string mode = cmd_args.get("color"); + if (mode == "auto") + Logger::color_mode = LOG_COLOR_AUTO; + else if (mode == "always") + Logger::color_mode = LOG_COLOR_ALWAYS; + else + Logger::color_mode = LOG_COLOR_NEVER; + } + // If trace is enabled, enable logging of certain things if (cmd_args.getFlag("trace")) { dstream << _("Enabling trace level debug output") << std::endl;