Make logs more efficient by avoiding argument evaluation for LOG* if

it's not needed at the current level
This commit is contained in:
Robert Swiecki 2022-08-05 08:42:37 +02:00
parent 856cb0f2ec
commit 9aee3dd831
4 changed files with 55 additions and 20 deletions

View File

@ -555,13 +555,13 @@ std::unique_ptr<nsjconf_t> parseArgs(int argc, char* argv[]) {
nsjconf->daemonize = true;
break;
case 'v':
logs::logLevel(logs::DEBUG);
logs::setLogLevel(logs::DEBUG);
break;
case 'q':
logs::logLevel(logs::WARNING);
logs::setLogLevel(logs::WARNING);
break;
case 'Q':
logs::logLevel(logs::FATAL);
logs::setLogLevel(logs::FATAL);
break;
case 'e':
nsjconf->keep_env = true;

View File

@ -102,19 +102,19 @@ static bool configParseInternal(nsjconf_t* nsjconf, const nsjail::NsJailConfig&
if (njc.has_log_level()) {
switch (njc.log_level()) {
case nsjail::LogLevel::DEBUG:
logs::logLevel(logs::DEBUG);
logs::setLogLevel(logs::DEBUG);
break;
case nsjail::LogLevel::INFO:
logs::logLevel(logs::INFO);
logs::setLogLevel(logs::INFO);
break;
case nsjail::LogLevel::WARNING:
logs::logLevel(logs::WARNING);
logs::setLogLevel(logs::WARNING);
break;
case nsjail::LogLevel::ERROR:
logs::logLevel(logs::ERROR);
logs::setLogLevel(logs::ERROR);
break;
case nsjail::LogLevel::FATAL:
logs::logLevel(logs::FATAL);
logs::setLogLevel(logs::FATAL);
break;
default:
LOG_E("Unknown log_level: %d", njc.log_level());

View File

@ -70,10 +70,14 @@ bool logSet() {
return _log_set;
}
void logLevel(enum llevel_t ll) {
void setLogLevel(enum llevel_t ll) {
_log_level = ll;
}
enum llevel_t getLogLevel(void) {
return _log_level;
}
void logFile(const std::string& log_file, int log_fd) {
_log_set = true;
int newlogfd = -1;

53
logs.h
View File

@ -33,17 +33,47 @@ namespace logs {
#define LOG_HELP_BOLD(...) \
logs::logMsg(logs::HELP_BOLD, __FUNCTION__, __LINE__, false, __VA_ARGS__);
#define LOG_D(...) logs::logMsg(logs::DEBUG, __FUNCTION__, __LINE__, false, __VA_ARGS__);
#define LOG_I(...) logs::logMsg(logs::INFO, __FUNCTION__, __LINE__, false, __VA_ARGS__);
#define LOG_W(...) logs::logMsg(logs::WARNING, __FUNCTION__, __LINE__, false, __VA_ARGS__);
#define LOG_E(...) logs::logMsg(logs::ERROR, __FUNCTION__, __LINE__, false, __VA_ARGS__);
#define LOG_F(...) logs::logMsg(logs::FATAL, __FUNCTION__, __LINE__, false, __VA_ARGS__);
#define LOG_D(...) \
if (logs::getLogLevel() <= logs::DEBUG) { \
logs::logMsg(logs::DEBUG, __FUNCTION__, __LINE__, false, __VA_ARGS__); \
}
#define LOG_I(...) \
if (logs::getLogLevel() <= logs::INFO) { \
logs::logMsg(logs::INFO, __FUNCTION__, __LINE__, false, __VA_ARGS__); \
}
#define LOG_W(...) \
if (logs::getLogLevel() <= logs::WARNING) { \
logs::logMsg(logs::WARNING, __FUNCTION__, __LINE__, false, __VA_ARGS__); \
}
#define LOG_E(...) \
if (logs::getLogLevel() <= logs::ERROR) { \
logs::logMsg(logs::ERROR, __FUNCTION__, __LINE__, false, __VA_ARGS__); \
}
#define LOG_F(...) \
if (logs::getLogLevel() <= logs::FATAL) { \
logs::logMsg(logs::FATAL, __FUNCTION__, __LINE__, false, __VA_ARGS__); \
}
#define PLOG_D(...) logs::logMsg(logs::DEBUG, __FUNCTION__, __LINE__, true, __VA_ARGS__);
#define PLOG_I(...) logs::logMsg(logs::INFO, __FUNCTION__, __LINE__, true, __VA_ARGS__);
#define PLOG_W(...) logs::logMsg(logs::WARNING, __FUNCTION__, __LINE__, true, __VA_ARGS__);
#define PLOG_E(...) logs::logMsg(logs::ERROR, __FUNCTION__, __LINE__, true, __VA_ARGS__);
#define PLOG_F(...) logs::logMsg(logs::FATAL, __FUNCTION__, __LINE__, true, __VA_ARGS__);
#define PLOG_D(...) \
if (logs::getLogLevel() <= logs::DEBUG) { \
logs::logMsg(logs::DEBUG, __FUNCTION__, __LINE__, true, __VA_ARGS__); \
}
#define PLOG_I(...) \
if (logs::getLogLevel() <= logs::INFO) { \
logs::logMsg(logs::INFO, __FUNCTION__, __LINE__, true, __VA_ARGS__); \
}
#define PLOG_W(...) \
if (logs::getLogLevel() <= logs::WARNING) { \
logs::logMsg(logs::WARNING, __FUNCTION__, __LINE__, true, __VA_ARGS__); \
}
#define PLOG_E(...) \
if (logs::getLogLevel() <= logs::ERROR) { \
logs::logMsg(logs::ERROR, __FUNCTION__, __LINE__, true, __VA_ARGS__); \
}
#define PLOG_F(...) \
if (logs::getLogLevel() <= logs::FATAL) { \
logs::logMsg(logs::FATAL, __FUNCTION__, __LINE__, true, __VA_ARGS__); \
}
enum llevel_t {
DEBUG = 0,
@ -58,7 +88,8 @@ enum llevel_t {
void logMsg(enum llevel_t ll, const char* fn, int ln, bool perr, const char* fmt, ...)
__attribute__((format(printf, 5, 6)));
void logStop(int sig);
void logLevel(enum llevel_t ll);
void setLogLevel(enum llevel_t ll);
enum llevel_t getLogLevel(void);
void logFile(const std::string& log_file, int log_fd);
bool logSet();