diff --git a/src/debug.cpp b/src/debug.cpp index be768bf34..e04357686 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -52,6 +52,7 @@ #include "debug.h" #include "host.h" #include "rang.hpp" +#include "utils/color_out.h" volatile int log_level = LOG_LEVEL_INFO; @@ -200,7 +201,7 @@ void debug_dump(void *lp, int len) } } -bool set_log_level(const char *optarg, bool *logger_repeat_msgs) { +bool set_log_level(const char *optarg, bool *logger_repeat_msgs, int *show_timestamps) { assert(optarg != nullptr); assert(logger_repeat_msgs != nullptr); @@ -225,8 +226,9 @@ bool set_log_level(const char *optarg, bool *logger_repeat_msgs) { for (auto m : mapping) { cout << "|" << m.name; } - cout << "][+repeat]\n"; - cout << "\trepeat - print repeating log messages\n"; + cout << "][+repeat][+/-timestamps]\n"; + cout << BOLD("\trepeat") << " - print repeating log messages\n"; + cout << BOLD("\ttimestamps") << " - enable/disable timestamps\n"; return false; } @@ -234,6 +236,12 @@ bool set_log_level(const char *optarg, bool *logger_repeat_msgs) { *logger_repeat_msgs = true; } + if (const char *timestamps = strstr(optarg, "timestamps")) { + if (timestamps > optarg) { + *show_timestamps = timestamps[-1] == '+' ? 1 : 0; + } + } + if (getenv("ULTRAGRID_VERBOSE") != nullptr) { log_level = LOG_LEVEL_VERBOSE; } @@ -263,9 +271,13 @@ bool set_log_level(const char *optarg, bool *logger_repeat_msgs) { return false; } -void Logger::preinit(bool skip_repeated) +/** + * @param show_timestamps 0 - no; 1 - yes; -1 auto + */ +void Logger::preinit(bool skip_repeated, int show_timestamps) { Logger::skip_repeated = skip_repeated; + Logger::show_timestamps = show_timestamps; if (rang::rang_implementation::supportsColor() && rang::rang_implementation::isTerminal(std::cout.rdbuf()) && rang::rang_implementation::isTerminal(std::cerr.rdbuf())) { @@ -283,4 +295,5 @@ void Logger::preinit(bool skip_repeated) std::atomic Logger::last_msg{}; std::atomic Logger::skip_repeated{true}; +int Logger::show_timestamps = -1; diff --git a/src/debug.h b/src/debug.h index 829fd6108..1a15bf3a7 100644 --- a/src/debug.h +++ b/src/debug.h @@ -79,7 +79,7 @@ void debug_dump(void*lp, int len); void log_msg(int log_level, const char *format, ...) ATTRIBUTE(format (printf, 2, 3)); void log_perror(int log_level, const char *msg); -bool set_log_level(const char *optarg, bool *logger_repeat_msgs); +bool set_log_level(const char *optarg, bool *logger_repeat_msgs, int *show_timestamps); #ifdef __cplusplus } @@ -99,7 +99,7 @@ class keyboard_control; // friend class Logger { public: - static void preinit(bool skip_repeated); + static void preinit(bool skip_repeated, int show_timetamps); inline Logger(int l) : level(l) {} inline ~Logger() { rang::fg color = rang::fg::reset; @@ -132,7 +132,7 @@ public: } std::ostringstream timestamp; - if (log_level >= LOG_LEVEL_VERBOSE) { + if (show_timestamps == 1 || (show_timestamps == -1 && log_level >= LOG_LEVEL_VERBOSE)) { auto time_ms = time_since_epoch_in_ms(); timestamp << "[" << std::fixed << std::setprecision(3) << time_ms / 1000.0 << "] "; } @@ -151,6 +151,7 @@ private: std::ostringstream oss; static std::atomic skip_repeated; + static int show_timestamps; struct last_message { std::string msg; int count{0}; diff --git a/src/host.cpp b/src/host.cpp index db264a8a5..5ae7fbc94 100644 --- a/src/host.cpp +++ b/src/host.cpp @@ -207,15 +207,16 @@ struct init_data *common_preinit(int argc, char *argv[], const char *log_opt) { struct init_data *init; bool logger_repeat_msgs = false; + int show_timestamps = -1; uv_argc = argc; uv_argv = argv; - if (log_opt != nullptr && !set_log_level(log_opt, &logger_repeat_msgs)) { + if (log_opt != nullptr && !set_log_level(log_opt, &logger_repeat_msgs, &show_timestamps)) { return nullptr; } - Logger::preinit(!logger_repeat_msgs); + Logger::preinit(!logger_repeat_msgs, show_timestamps); #ifdef HAVE_X void *handle = dlopen(X11_LIB_NAME, RTLD_NOW);