Add chat_log_level setting (#9223)

Log all higher levels in LogOutputBuffer
Move StreamLogOutput::logRaw to source file like LogOutputBuffer::logRaw for compiling speed
This commit is contained in:
SmallJoker 2020-05-14 19:26:15 +02:00 committed by GitHub
parent 2d7e000cfe
commit 836dd4a1e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 95 additions and 51 deletions

@ -1401,6 +1401,9 @@ debug_log_level (Debug log level) enum action ,none,error,warning,action,info,ve
# debug.txt is only moved if this setting is positive. # debug.txt is only moved if this setting is positive.
debug_log_size_max (Debug log file size threshold) int 50 debug_log_size_max (Debug log file size threshold) int 50
# Minimal level of logging to be written to chat.
chat_log_level (Chat log level) enum error ,none,error,warning,action,info,verbose
# Enable IPv6 support (for both client and server). # Enable IPv6 support (for both client and server).
# Required for IPv6 connections to work at all. # Required for IPv6 connections to work at all.
enable_ipv6 (IPv6) bool true enable_ipv6 (IPv6) bool true

@ -855,6 +855,7 @@ private:
SoundMaker *soundmaker = nullptr; SoundMaker *soundmaker = nullptr;
ChatBackend *chat_backend = nullptr; ChatBackend *chat_backend = nullptr;
LogOutputBuffer m_chat_log_buf;
EventManager *eventmgr = nullptr; EventManager *eventmgr = nullptr;
QuicktuneShortcutter *quicktune = nullptr; QuicktuneShortcutter *quicktune = nullptr;
@ -926,6 +927,7 @@ private:
}; };
Game::Game() : Game::Game() :
m_chat_log_buf(g_logger),
m_game_ui(new GameUI()) m_game_ui(new GameUI())
{ {
g_settings->registerChangedCallback("doubletap_jump", g_settings->registerChangedCallback("doubletap_jump",
@ -1192,6 +1194,7 @@ void Game::shutdown()
chat_backend->addMessage(L"", L"# Disconnected."); chat_backend->addMessage(L"", L"# Disconnected.");
chat_backend->addMessage(L"", L""); chat_backend->addMessage(L"", L"");
m_chat_log_buf.clear();
if (client) { if (client) {
client->Stop(); client->Stop();
@ -2903,18 +2906,9 @@ void Game::processClientEvents(CameraOrientation *cam)
void Game::updateChat(f32 dtime, const v2u32 &screensize) void Game::updateChat(f32 dtime, const v2u32 &screensize)
{ {
// Add chat log output for errors to be shown in chat
static LogOutputBuffer chat_log_error_buf(g_logger, LL_ERROR);
// Get new messages from error log buffer // Get new messages from error log buffer
while (!chat_log_error_buf.empty()) { while (!m_chat_log_buf.empty())
std::wstring error_message = utf8_to_wide(chat_log_error_buf.get()); chat_backend->addMessage(L"", utf8_to_wide(m_chat_log_buf.get()));
if (!g_settings->getBool("disable_escape_sequences")) {
error_message.insert(0, L"\x1b(c@red)");
error_message.append(L"\x1b(c@white)");
}
chat_backend->addMessage(L"", error_message);
}
// Get new messages from client // Get new messages from client
std::wstring message; std::wstring message;

@ -400,6 +400,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("remote_media", ""); settings->setDefault("remote_media", "");
settings->setDefault("debug_log_level", "action"); settings->setDefault("debug_log_level", "action");
settings->setDefault("debug_log_size_max", "50"); settings->setDefault("debug_log_size_max", "50");
settings->setDefault("chat_log_level", "error");
settings->setDefault("emergequeue_limit_total", "512"); settings->setDefault("emergequeue_limit_total", "512");
settings->setDefault("emergequeue_limit_diskonly", "64"); settings->setDefault("emergequeue_limit_diskonly", "64");
settings->setDefault("emergequeue_limit_generate", "64"); settings->setDefault("emergequeue_limit_generate", "64");

@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "debug.h" #include "debug.h"
#include "gettime.h" #include "gettime.h"
#include "porting.h" #include "porting.h"
#include "settings.h"
#include "config.h" #include "config.h"
#include "exceptions.h" #include "exceptions.h"
#include "util/numeric.h" #include "util/numeric.h"
@ -338,7 +339,80 @@ void FileLogOutput::setFile(const std::string &filename, s64 file_size_max)
"-------------\n" << std::endl; "-------------\n" << std::endl;
} }
void StreamLogOutput::logRaw(LogLevel lev, const std::string &line)
{
bool colored_message = (Logger::color_mode == LOG_COLOR_ALWAYS) ||
(Logger::color_mode == LOG_COLOR_AUTO && is_tty);
if (colored_message) {
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_message = false;
}
}
m_stream << line << std::endl;
if (colored_message) {
// reset to white color
m_stream << "\033[0m";
}
}
void LogOutputBuffer::updateLogLevel()
{
const std::string &conf_loglev = g_settings->get("chat_log_level");
LogLevel log_level = Logger::stringToLevel(conf_loglev);
if (log_level == LL_MAX) {
warningstream << "Supplied unrecognized chat_log_level; "
"showing none." << std::endl;
log_level = LL_NONE;
}
m_logger.removeOutput(this);
m_logger.addOutputMaxLevel(this, log_level);
}
void LogOutputBuffer::logRaw(LogLevel lev, const std::string &line)
{
std::string color;
if (!g_settings->getBool("disable_escape_sequences")) {
switch (lev) {
case LL_ERROR: // red
color = "\x1b(c@#F00)";
break;
case LL_WARNING: // yellow
color = "\x1b(c@#EE0)";
break;
case LL_INFO: // grey
color = "\x1b(c@#BBB)";
break;
case LL_VERBOSE: // dark grey
color = "\x1b(c@#888)";
break;
default: break;
}
}
m_buffer.push(color.append(line));
}
//// ////
//// *Buffer methods //// *Buffer methods

@ -124,39 +124,7 @@ public:
#endif #endif
} }
void logRaw(LogLevel lev, const std::string &line) void logRaw(LogLevel lev, const std::string &line);
{
bool colored_message = (Logger::color_mode == LOG_COLOR_ALWAYS) ||
(Logger::color_mode == LOG_COLOR_AUTO && is_tty);
if (colored_message)
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_message = false;
}
m_stream << line << std::endl;
if (colored_message)
// reset to white color
m_stream << "\033[0m";
}
private: private:
std::ostream &m_stream; std::ostream &m_stream;
@ -178,23 +146,27 @@ private:
class LogOutputBuffer : public ICombinedLogOutput { class LogOutputBuffer : public ICombinedLogOutput {
public: public:
LogOutputBuffer(Logger &logger, LogLevel lev) : LogOutputBuffer(Logger &logger) :
m_logger(logger) m_logger(logger)
{ {
m_logger.addOutput(this, lev); updateLogLevel();
} };
~LogOutputBuffer() virtual ~LogOutputBuffer()
{ {
m_logger.removeOutput(this); m_logger.removeOutput(this);
} }
void logRaw(LogLevel lev, const std::string &line) void updateLogLevel();
void logRaw(LogLevel lev, const std::string &line);
void clear()
{ {
m_buffer.push(line); m_buffer = std::queue<std::string>();
} }
bool empty() bool empty() const
{ {
return m_buffer.empty(); return m_buffer.empty();
} }