diff --git a/src/server.c b/src/server.c index e19ddbed8..35c012c12 100644 --- a/src/server.c +++ b/src/server.c @@ -1161,12 +1161,10 @@ void serverLogRaw(int level, const char *msg) { /* Like serverLogRaw() but with printf-alike support. This is the function that * is used across the code. The raw version is only used in order to dump * the INFO output on crash. */ -void serverLog(int level, const char *fmt, ...) { +void _serverLog(int level, const char *fmt, ...) { va_list ap; char msg[LOG_MAX_LEN]; - if ((level&0xff) < server.verbosity) return; - va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); va_end(ap); diff --git a/src/server.h b/src/server.h index 9bce17d0f..b462131a5 100644 --- a/src/server.h +++ b/src/server.h @@ -2210,10 +2210,10 @@ void preventCommandAOF(client *c); void preventCommandReplication(client *c); int prepareForShutdown(int flags); #ifdef __GNUC__ -void serverLog(int level, const char *fmt, ...) +void _serverLog(int level, const char *fmt, ...) __attribute__((format(printf, 2, 3))); #else -void serverLog(int level, const char *fmt, ...); +void _serverLog(int level, const char *fmt, ...); #endif void serverLogRaw(int level, const char *msg); void serverLogFromHandler(int level, const char *msg); @@ -2719,6 +2719,13 @@ void killIOThreads(void); void killThreads(void); void makeThreadKillable(void); +/* Use macro for checking log level to avoid evaluating arguments in cases log + * should be ignored due to low level. */ +#define serverLog(level, ...) do {\ + if (((level)&0xff) < server.verbosity) break;\ + _serverLog(level, __VA_ARGS__);\ + } while(0) + /* TLS stuff */ void tlsInit(void); void tlsCleanup(void);