From 81506c61eba5a439dffba6439e08d8077fd7fc5d Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Thu, 3 Sep 2015 09:44:56 +0300 Subject: [PATCH] MXS-343: Minor refactoring of logging. So that the functionality earlier in skygw_log_write[flush] need not be duplicated. To be used by new logging functions. --- log_manager/log_manager.cc | 170 ++++++++++++++++++++----------------- 1 file changed, 92 insertions(+), 78 deletions(-) diff --git a/log_manager/log_manager.cc b/log_manager/log_manager.cc index 5f708c5b8..4b0989076 100644 --- a/log_manager/log_manager.cc +++ b/log_manager/log_manager.cc @@ -1359,59 +1359,104 @@ return_succp: return succp; } +/** + * Helper for skygw_log_write and friends. + * + * @param id The id of the log file. + * @param flush Whether the log should be flushed. + * @param len The length of the formatted string, as calculated by vsnprintf. + * @param str The printf format string. + * @param valist The arguments of /str/. + * + * @return 0 if the logging to at least one log succeeded. + */ + +static int log_write(logfile_id_t id, + bool flush, + size_t len, + const char* str, + va_list valist) +{ + int rv = 0; + + if (logmanager_register(true)) + { + CHK_LOGMANAGER(lm); + + int attempts = 0; + int successes = 0; + + /** + * Add one for line feed. + */ + len += sizeof(char); + + for (int i = LOGFILE_FIRST; i <= LOGFILE_LAST; i <<= 1) + { + /** + * If a particular log is enabled in general and it is enabled for + * the current session, log the stuff. + */ + if (LOG_IS_ENABLED(i) && ((i & id) != 0)) + { + ++attempts; + + const bool use_valist = true; + const bool spread_down = true; + const bool rotate = false; + + if (logmanager_write_log((logfile_id_t)i, flush, use_valist, spread_down, rotate, + len, str, valist) == 0) + { + ++successes; + } + } + } + + logmanager_unregister(); + + // Only if logging was attempted and nothing succeeded, it is considered a failure. + if ((attempts != 0) && (successes == 0)) + { + rv = -1; + } + } + else + { + rv = -1; + } + + return rv; +} int skygw_log_write_flush( logfile_id_t id, const char* str, ...) { - int i,err = 0; + int err = 0; va_list valist; - size_t len; - - if (!logmanager_register(true)) - { - err = -1; - goto return_err; - } - CHK_LOGMANAGER(lm); /** * Find out the length of log string (to be formatted str). */ va_start(valist, str); - len = sizeof(char) * vsnprintf(NULL, 0, str, valist); + size_t len = vsnprintf(NULL, 0, str, valist); va_end(valist); - /** - * Add one for line feed. - */ - len += sizeof(char); - /** - * Write log string to buffer and add to file write list. - */ - for (i = LOGFILE_FIRST; i<=LOGFILE_LAST ;i <<=1) - { - /** - * If particular log is disabled in general and it is not enabled for - * the current session, check the next log. - */ - if (!LOG_IS_ENABLED(i) || (i & id) == 0) - { - continue; - } + + if (len >= 0) { + const bool flush = true; va_start(valist, str); - err = logmanager_write_log((logfile_id_t)i, true, true, true, false, len, str, valist); + err = log_write(id, flush, len, str, valist); va_end(valist); - if (err != 0) { + if (err != 0) + { fprintf(stderr, "skygw_log_write_flush failed.\n"); - break; } } - logmanager_unregister(); -return_err: return err; } @@ -1422,60 +1467,29 @@ int skygw_log_write( const char* str, ...) { - int i,err = 0; - va_list valist; - size_t len; + int err = 0; + va_list valist; - if (!logmanager_register(true)) - { - err = -1; - goto return_err; - } - CHK_LOGMANAGER(lm); + /** + * Find out the length of log string (to be formatted str). + */ + va_start(valist, str); + size_t len = vsnprintf(NULL, 0, str, valist); + va_end(valist); - /** - * If particular log is disabled in general and it is not enabled for - * the current session, then unregister and return. - */ + if (len >= 0) { + const bool flush = false; - /** - * Find out the length of log string (to be formatted str). - */ va_start(valist, str); - len = vsnprintf(NULL, 0, str, valist); + err = log_write(id, flush, len, str, valist); va_end(valist); - /** - * Add one for line feed. - */ - len += 1; - /** - * Write log string to buffer and add to file write list. - */ - for (i = LOGFILE_FIRST; i<=LOGFILE_LAST; i <<=1) - { - /** - * If particular log is disabled in general and it is not enabled for - * the current session, check the next log. - */ - if (!LOG_IS_ENABLED(i) || (i & id) == 0) - { - continue; - } - - va_start(valist, str); - err = logmanager_write_log((logfile_id_t)i, false, true, true, false, len, str, valist); - va_end(valist); - - if (err != 0) { - fprintf(stderr, "skygw_log_write failed.\n"); - break; - } + if (err != 0) { + fprintf(stderr, "skygw_log_write failed.\n"); } + } - logmanager_unregister(); -return_err: - return err; + return err; }