refactor(logger): Restrict trace logs to debug builds

This commit is contained in:
Michael Carlberg 2016-06-21 04:29:33 +02:00
parent 4bed34156e
commit 4d444da0e4
3 changed files with 62 additions and 36 deletions

View File

@ -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));
}

View File

@ -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
}
}
/**

View File

@ -16,55 +16,62 @@ std::shared_ptr<Logger> &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
}