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; nsjconf->daemonize = true;
break; break;
case 'v': case 'v':
logs::logLevel(logs::DEBUG); logs::setLogLevel(logs::DEBUG);
break; break;
case 'q': case 'q':
logs::logLevel(logs::WARNING); logs::setLogLevel(logs::WARNING);
break; break;
case 'Q': case 'Q':
logs::logLevel(logs::FATAL); logs::setLogLevel(logs::FATAL);
break; break;
case 'e': case 'e':
nsjconf->keep_env = true; nsjconf->keep_env = true;

View File

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

View File

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

53
logs.h
View File

@ -33,17 +33,47 @@ namespace logs {
#define LOG_HELP_BOLD(...) \ #define LOG_HELP_BOLD(...) \
logs::logMsg(logs::HELP_BOLD, __FUNCTION__, __LINE__, false, __VA_ARGS__); logs::logMsg(logs::HELP_BOLD, __FUNCTION__, __LINE__, false, __VA_ARGS__);
#define LOG_D(...) logs::logMsg(logs::DEBUG, __FUNCTION__, __LINE__, false, __VA_ARGS__); #define LOG_D(...) \
#define LOG_I(...) logs::logMsg(logs::INFO, __FUNCTION__, __LINE__, false, __VA_ARGS__); if (logs::getLogLevel() <= logs::DEBUG) { \
#define LOG_W(...) logs::logMsg(logs::WARNING, __FUNCTION__, __LINE__, false, __VA_ARGS__); logs::logMsg(logs::DEBUG, __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_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_D(...) \
#define PLOG_I(...) logs::logMsg(logs::INFO, __FUNCTION__, __LINE__, true, __VA_ARGS__); if (logs::getLogLevel() <= logs::DEBUG) { \
#define PLOG_W(...) logs::logMsg(logs::WARNING, __FUNCTION__, __LINE__, true, __VA_ARGS__); logs::logMsg(logs::DEBUG, __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_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 { enum llevel_t {
DEBUG = 0, 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, ...) void logMsg(enum llevel_t ll, const char* fn, int ln, bool perr, const char* fmt, ...)
__attribute__((format(printf, 5, 6))); __attribute__((format(printf, 5, 6)));
void logStop(int sig); 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); void logFile(const std::string& log_file, int log_fd);
bool logSet(); bool logSet();