From bed1c60fd429c5215ce1d89d9f1b2f1b893f5eec Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Wed, 13 Jun 2018 14:01:57 +0300 Subject: [PATCH] MXS-421 Allow specifying a facility when logging In principle a syslog priority consists of a syslog level bit-or:d with a syslog facility. That's clear from the syslog man page, but not so clear from the code in syslog.h. Anyway, to make it possible to log using a specific facility (instead of the default LOG_USER), we must allow priorities that include a specified facility. --- server/core/log_manager.cc | 58 ++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/server/core/log_manager.cc b/server/core/log_manager.cc index 392eebd1f..35a43b151 100644 --- a/server/core/log_manager.cc +++ b/server/core/log_manager.cc @@ -870,8 +870,8 @@ static int logmanager_write_log(int priority, int do_maxlog = log_config.do_maxlog; int do_syslog = log_config.do_syslog; - assert(str); - assert((priority & ~LOG_PRIMASK) == 0); + ss_dassert(str); + ss_dassert((priority & ~(LOG_PRIMASK | LOG_FACMASK)) == 0); CHK_LOGMANAGER(lm); // All messages are now logged to the error log file. @@ -987,7 +987,7 @@ static int logmanager_write_log(int priority, // Strip away the timestamp and the prefix (e.g. "error : "). const char *message = wp + timestamp_len + prefix_len; - switch (priority) + switch (priority & LOG_PRIMASK) { case LOG_EMERG: case LOG_ALERT: @@ -2116,8 +2116,8 @@ static bool filewriter_init(logmanager_t* logmanager, filewriter_t* fw, bool wri bool succ = false; CHK_LOGMANAGER(logmanager); - assert(logmanager->lm_clientmes); - assert(logmanager->lm_logmes); + ss_dassert(logmanager->lm_clientmes); + ss_dassert(logmanager->lm_logmes); fw->fwr_state = INIT; #if defined(SS_DEBUG) @@ -2696,12 +2696,12 @@ int mxs_log_rotate() return err; } -static const char* priority_name(int priority) +static const char* level_name(int level) { - switch (priority) + switch (level) { case LOG_EMERG: - return "emercency"; + return "emergency"; case LOG_ALERT: return "alert"; case LOG_CRIT: @@ -2717,7 +2717,7 @@ static const char* priority_name(int priority) case LOG_DEBUG: return "debug"; default: - assert(!true); + ss_dassert(!true); return "unknown"; } } @@ -2730,14 +2730,14 @@ static const char* priority_name(int priority) * * @return 0 if the priority was valid, -1 otherwise. */ -int mxs_log_set_priority_enabled(int priority, bool enable) +int mxs_log_set_priority_enabled(int level, bool enable) { int rv = -1; const char* text = (enable ? "enable" : "disable"); - if ((priority & ~LOG_PRIMASK) == 0) + if ((level & ~LOG_PRIMASK) == 0) { - int bit = (1 << priority); + int bit = (1 << level); if (enable) { @@ -2749,11 +2749,11 @@ int mxs_log_set_priority_enabled(int priority, bool enable) mxs_log_enabled_priorities &= ~bit; } - MXS_NOTICE("The logging of %s messages has been %sd.", priority_name(priority), text); + MXS_NOTICE("The logging of %s messages has been %sd.", level_name(level), text); } else { - MXS_ERROR("Attempt to %s unknown syslog priority %d.", text, priority); + MXS_ERROR("Attempt to %s unknown syslog priority %d.", text, level); } return rv; @@ -2774,13 +2774,13 @@ static const char PREFIX_NOTICE[] = "notice : "; static const char PREFIX_INFO[] = "info : "; static const char PREFIX_DEBUG[] = "debug : "; -static log_prefix_t priority_to_prefix(int priority) +static log_prefix_t level_to_prefix(int level) { - assert((priority & ~LOG_PRIMASK) == 0); + ss_dassert((level & ~LOG_PRIMASK) == 0); log_prefix_t prefix; - switch (priority) + switch (level) { case LOG_EMERG: prefix.text = PREFIX_EMERG; @@ -2823,7 +2823,7 @@ static log_prefix_t priority_to_prefix(int priority) break; default: - assert(!true); + ss_dassert(!true); prefix.text = PREFIX_ERROR; prefix.len = sizeof(PREFIX_ERROR); break; @@ -2834,11 +2834,11 @@ static log_prefix_t priority_to_prefix(int priority) return prefix; } -static enum log_flush priority_to_flush(int priority) +static enum log_flush level_to_flush(int level) { - assert((priority & ~LOG_PRIMASK) == 0); + ss_dassert((level & ~LOG_PRIMASK) == 0); - switch (priority) + switch (level) { case LOG_EMERG: case LOG_ALERT: @@ -2847,7 +2847,7 @@ static enum log_flush priority_to_flush(int priority) return LOG_FLUSH_YES; default: - assert(!true); + ss_dassert(!true); case LOG_WARNING: case LOG_NOTICE: case LOG_INFO: @@ -2894,9 +2894,11 @@ int mxs_log_message(int priority, { int err = 0; - assert((priority & ~LOG_PRIMASK) == 0); + ss_dassert((priority & ~(LOG_PRIMASK | LOG_FACMASK)) == 0); - if ((priority & ~LOG_PRIMASK) == 0) // Check that the priority is ok, + int level = priority & LOG_PRIMASK; + + if ((priority & ~(LOG_PRIMASK | LOG_FACMASK)) == 0) // Check that the priority is ok, { message_suppression_t status = MESSAGE_NOT_SUPPRESSED; @@ -2905,7 +2907,7 @@ int mxs_log_message(int priority, // we are presumably debugging something. Notice messages are // assumed to be logged for a reason and always in a context where // flooding cannot be caused. - if ((priority == LOG_ERR) || (priority == LOG_WARNING)) + if ((level == LOG_ERR) || (level == LOG_WARNING)) { status = message_status(file, line); } @@ -2952,7 +2954,7 @@ int mxs_log_message(int priority, if (message_len >= 0) { - log_prefix_t prefix = priority_to_prefix(priority); + log_prefix_t prefix = level_to_prefix(level); static const char FORMAT_FUNCTION[] = "(%s): "; @@ -3026,7 +3028,7 @@ int mxs_log_message(int priority, break; default: - assert(!true); + ss_dassert(!true); } (void)len; @@ -3042,7 +3044,7 @@ int mxs_log_message(int priority, sprintf(suppression_text, SUPPRESSION, suppress_ms); } - enum log_flush flush = priority_to_flush(priority); + enum log_flush flush = level_to_flush(level); err = log_write(priority, file, line, function, prefix.len, buffer_len, buffer, flush); }