Add coloured logs (#4549)

The setting log_colour can be used to en-/disable or autodetect it.
This commit is contained in:
you 2017-12-06 18:50:39 +01:00 committed by SmallJoker
parent 4edf087090
commit e049405fdc
3 changed files with 48 additions and 0 deletions

@ -1207,6 +1207,13 @@ language (Language) enum ,be,ca,cs,da,de,en,eo,es,et,fr,he,hu,id,it,ja,jbo,ko,
# - verbose # - verbose
debug_log_level (Debug log level) enum action ,none,error,warning,action,info,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. # IPv6 support.
enable_ipv6 (IPv6) bool true enable_ipv6 (IPv6) bool true

@ -349,6 +349,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("ignore_world_load_errors", "false"); settings->setDefault("ignore_world_load_errors", "false");
settings->setDefault("remote_media", ""); settings->setDefault("remote_media", "");
settings->setDefault("debug_log_level", "action"); settings->setDefault("debug_log_level", "action");
settings->setDefault("log_color", "detect");
settings->setDefault("emergequeue_limit_total", "256"); settings->setDefault("emergequeue_limit_total", "256");
settings->setDefault("emergequeue_limit_diskonly", "32"); settings->setDefault("emergequeue_limit_diskonly", "32");
settings->setDefault("emergequeue_limit_generate", "32"); settings->setDefault("emergequeue_limit_generate", "32");

@ -25,6 +25,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <fstream> #include <fstream>
#include <thread> #include <thread>
#include <mutex> #include <mutex>
#if !defined(_WIN32) // POSIX
#include <unistd.h>
#endif
#include "settings.h"
#include "irrlichttypes.h" #include "irrlichttypes.h"
class ILogOutput; class ILogOutput;
@ -106,15 +110,51 @@ public:
StreamLogOutput(std::ostream &stream) : StreamLogOutput(std::ostream &stream) :
m_stream(stream) m_stream(stream)
{ {
#if !defined(_WIN32)
is_tty = isatty(fileno(stdout));
#else
is_tty = false;
#endif
} }
void logRaw(LogLevel lev, const std::string &line) 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)
switch (lev) {
case LL_ERROR:
// error is red
m_stream << "\033[91m";
break;
case LL_WARNING:
// warning is yellow
m_stream << "\033[93m";
break;
case LL_INFO:
// info is a bit dark
m_stream << "\033[37m";
break;
case LL_VERBOSE:
// verbose is darker than info
m_stream << "\033[2m";
break;
default:
// action is white
colored = false;
}
m_stream << line << std::endl; m_stream << line << std::endl;
if (colored)
// reset to white color
m_stream << "\033[0m";
} }
private: private:
std::ostream &m_stream; std::ostream &m_stream;
bool is_tty;
}; };
class FileLogOutput : public ICombinedLogOutput { class FileLogOutput : public ICombinedLogOutput {