diff --git a/include/services/logger.hpp b/include/services/logger.hpp index 4bbfa8f5..d7488070 100644 --- a/include/services/logger.hpp +++ b/include/services/logger.hpp @@ -21,7 +21,11 @@ #define log_warning(s) get_logger()->warning(s) #define log_info(s) get_logger()->info(s) #define log_debug(s) get_logger()->debug(s) +#ifdef DEBUG #define log_trace(s) get_logger()->trace(__FILE__, __FUNCTION__, __LINE__, s) +#else +#define log_trace(s) if (0) {} +#endif enum LogLevel { @@ -31,7 +35,11 @@ enum LogLevel LEVEL_INFO = 1 << 4, LEVEL_DEBUG = 1 << 8, LEVEL_TRACE = 1 << 16, +#ifdef DEBUG LEVEL_ALL = LEVEL_ERROR | LEVEL_WARNING | LEVEL_INFO | LEVEL_DEBUG | LEVEL_TRACE +#else + LEVEL_ALL = LEVEL_ERROR | LEVEL_WARNING | LEVEL_INFO | LEVEL_DEBUG +#endif }; class Logger @@ -41,24 +49,27 @@ class Logger int level = LogLevel::LEVEL_ERROR | LogLevel::LEVEL_WARNING | LogLevel::LEVEL_INFO; int fd = LOGGER_FD; + void output(std::string tag, std::string msg); + public: Logger(); - // void set_level(int level); + void set_level(int level); void add_level(int level); - void fatal(const std::string& msg); - void error(const std::string& msg); - void warning(const std::string& msg); - void info(const std::string& msg); - void debug(const std::string& msg); - void trace(const char *file, const char *fn, int lineno, const std::string& msg); + void fatal(std::string msg); + void error(std::string msg); + void warning(std::string msg); + void info(std::string msg); + void debug(std::string msg); void fatal(int msg) { fatal(std::to_string(msg)); } void error(int msg) { error(std::to_string(msg)); } void warning(int msg) { warning(std::to_string(msg)); } void info(int msg) { info(std::to_string(msg)); } void debug(int msg) { debug(std::to_string(msg)); } + + void trace(const char *file, const char *fn, int lineno, std::string msg); void trace(const char *file, const char *fn, int lineno, int msg) { trace(file, fn, lineno, std::to_string(msg)); } diff --git a/src/lemonbuddy.cpp b/src/lemonbuddy.cpp index d921f732..c3ff82b6 100644 --- a/src/lemonbuddy.cpp +++ b/src/lemonbuddy.cpp @@ -56,7 +56,7 @@ int main(int argc, char **argv) cli::add_option("-h", "--help", "Show help options"); cli::add_option("-c", "--config", "FILE", "Path to the configuration file"); cli::add_option("-p", "--pipe", "FILE", "Path to the input pipe"); - cli::add_option("-l", "--log", "LEVEL", "Set the logging verbosity", {"info","debug","trace"}); + cli::add_option("-l", "--log", "LEVEL", "Set the logging verbosity", {"warning","info","debug","trace"}); cli::add_option("-d", "--dump", "PARAM", "Show value of PARAM in section [bar_name]"); cli::add_option("-x", "--print-exec", "Print the generated command line string used to start the lemonbar process"); cli::add_option("-w", "--print-wmname", "Print the generated WM_NAME"); @@ -74,12 +74,20 @@ int main(int argc, char **argv) * Set logging verbosity */ if (cli::has_option("log")) { - if (cli::match_option_value("log", "info")) - logger->add_level(LogLevel::LEVEL_INFO); + logger->set_level(LogLevel::LEVEL_ERROR); + + if (cli::match_option_value("log", "warning")) + logger->set_level(LogLevel::LEVEL_WARNING); + else if (cli::match_option_value("log", "info")) + logger->add_level(LogLevel::LEVEL_WARNING | LogLevel::LEVEL_INFO); else if (cli::match_option_value("log", "debug")) - logger->add_level(LogLevel::LEVEL_INFO | LogLevel::LEVEL_DEBUG); - else if (cli::match_option_value("log", "trace")) - logger->add_level(LogLevel::LEVEL_INFO | LogLevel::LEVEL_DEBUG | LogLevel::LEVEL_TRACE); + logger->add_level(LogLevel::LEVEL_WARNING | LogLevel::LEVEL_INFO | LogLevel::LEVEL_DEBUG); + else if (cli::match_option_value("log", "trace")) { + logger->add_level(LogLevel::LEVEL_WARNING | LogLevel::LEVEL_INFO | LogLevel::LEVEL_DEBUG); +#ifdef DEBUG + logger->add_level(LogLevel::LEVEL_TRACE); +#endif + } } /** diff --git a/src/services/logger.cpp b/src/services/logger.cpp index 27605507..00d2bc26 100644 --- a/src/services/logger.cpp +++ b/src/services/logger.cpp @@ -16,55 +16,62 @@ std::shared_ptr &get_logger() Logger::Logger() { - if (isatty(LOGGER_FD)) { + if (isatty(LOGGER_FD)) dup2(LOGGER_FD, this->fd); - } } -// void Logger::set_level(int mask) -// { -// this->level = mask; -// } +void Logger::set_level(int mask) { + this->level = mask; +} -void Logger::add_level(int mask) -{ +void Logger::add_level(int mask) { this->level |= mask; } -void Logger::fatal(const std::string& msg) +void Logger::output(std::string tag, std::string msg) { + dprintf(this->fd, "%s%s\n", tag.c_str(), msg.c_str()); +} + +void Logger::fatal(std::string msg) { - dprintf(this->fd, "%s%s\n", LOGGER_TAG_FATAL, msg.c_str()); + this->output(LOGGER_TAG_FATAL, msg); std::exit(EXIT_FAILURE); } -void Logger::error(const std::string& msg) +void Logger::error(std::string msg) { if (this->level & LogLevel::LEVEL_ERROR) - dprintf(this->fd, "%s%s\n", LOGGER_TAG_ERR, msg.c_str()); + this->output(LOGGER_TAG_ERR, msg); } -void Logger::warning(const std::string& msg) +void Logger::warning(std::string msg) { if (this->level & LogLevel::LEVEL_WARNING) - dprintf(this->fd, "%s%s\n", LOGGER_TAG_WARN, msg.c_str()); + this->output(LOGGER_TAG_WARN, msg); } -void Logger::info(const std::string& msg) +void Logger::info(std::string msg) { if (this->level & LogLevel::LEVEL_INFO) - dprintf(this->fd, "%s%s\n", LOGGER_TAG_INFO, msg.c_str()); + this->output(LOGGER_TAG_INFO, msg); } -void Logger::debug(const std::string& msg) +void Logger::debug(std::string msg) { if (this->level & LogLevel::LEVEL_DEBUG) - dprintf(this->fd, "%s%s\n", LOGGER_TAG_DEBUG, msg.c_str()); + this->output(LOGGER_TAG_DEBUG, msg); } -void Logger::trace(const char *file, const char *fn, int lineno, const std::string& msg) +void Logger::trace(const char *file, const char *fn, int lineno, std::string msg) { - if (this->level & LogLevel::LEVEL_TRACE && !msg.empty()) - dprintf(this->fd, "%s%s (%s:%d) -> %s\n", LOGGER_TAG_TRACE, &file[0], fn, lineno, msg.c_str()); - else if (msg.empty()) - dprintf(this->fd, "%s%s (%s:%d)\n", LOGGER_TAG_TRACE, &file[0], fn, lineno); +#ifdef DEBUG + if (!(this->level & LogLevel::LEVEL_TRACE)) + return; + char trace_msg[1024]; + if (!msg.empty()) + sprintf(trace_msg, "%s (%s:%d) -> %s", &file[0], fn, lineno, msg.c_str()); + else + sprintf(trace_msg, "%s (%s:%d)", &file[0], fn, lineno); + this->output(LOGGER_TAG_TRACE, trace_msg); +#endif }