Permalink
Browse files

Add coloured logs (#4549)

The setting log_colour can be used to en-/disable or autodetect it.
  • Loading branch information...
HybridDog authored and SmallJoker committed Dec 6, 2017
1 parent 4edf087 commit e049405fdc688a4d619f3ae88008bbe5ee85b569
Showing with 48 additions and 0 deletions.
  1. +7 −0 builtin/settingtypes.txt
  2. +1 −0 src/defaultsettings.cpp
  3. +40 −0 src/log.h
@@ -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
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

@@ -349,6 +349,7 @@ 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");
@@ -25,6 +25,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <fstream>
#include <thread>
#include <mutex>
#if !defined(_WIN32) // POSIX
#include <unistd.h>
#endif
#include "settings.h"
#include "irrlichttypes.h"

class ILogOutput;
@@ -106,15 +110,51 @@ class StreamLogOutput : public ICombinedLogOutput {
StreamLogOutput(std::ostream &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)
{
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;

if (colored)
// reset to white color
m_stream << "\033[0m";
}

private:
std::ostream &m_stream;
bool is_tty;
};

class FileLogOutput : public ICombinedLogOutput {

0 comments on commit e049405

Please sign in to comment.