MXS-2014 Introduce possibility for providing log context

The current implementation of mxs_log_message() is otherwise
generic, but for the fact that the session id is automatically
injected into the message.

With this change, a mxs_log_init2() is introduced that in addition
to the existing parameters takes a function using which the context
can be provided. The implementation of mxs_log_init() now simply
calls mxs_log_init2() giving a function that provides the MaxScale
context.

This is in preparation for moving maxscale/log_manager.h to
maxbase/log.h.
This commit is contained in:
Johan Wikman
2018-08-15 10:55:23 +03:00
parent 3e0086cd09
commit f98cb0fe8d
2 changed files with 47 additions and 21 deletions

View File

@ -92,6 +92,8 @@ typedef struct mxs_log_throttling
size_t suppress_ms; // If exceeded, suppress such messages for this many ms. size_t suppress_ms; // If exceeded, suppress such messages for this many ms.
} MXS_LOG_THROTTLING; } MXS_LOG_THROTTLING;
bool mxs_log_init2(const char* ident, const char* logdir, mxs_log_target_t target,
size_t (*get_context)(char*, size_t));
bool mxs_log_init(const char* ident, const char* logdir, mxs_log_target_t target); bool mxs_log_init(const char* ident, const char* logdir, mxs_log_target_t target);
void mxs_log_finish(void); void mxs_log_finish(void);
bool mxs_log_rotate(); bool mxs_log_rotate();

View File

@ -297,6 +297,25 @@ private:
} }
static std::unique_ptr<MessageRegistry> message_registry; static std::unique_ptr<MessageRegistry> message_registry;
static size_t (*get_context)(char* buffer, size_t len);
static size_t mxs_get_context(char* buffer, size_t len)
{
ss_dassert(len >= 20); // Needed for "9223372036854775807"
uint64_t session_id = session_get_current_id();
if (session_id != 0)
{
len = snprintf(buffer, len, "%" PRIu64, session_id);
}
else
{
len = 0;
}
return len;
}
/** /**
* Initializes log manager * Initializes log manager
@ -307,7 +326,8 @@ static std::unique_ptr<MessageRegistry> message_registry;
* *
* @return true if succeed, otherwise false * @return true if succeed, otherwise false
*/ */
bool mxs_log_init(const char* ident, const char* logdir, mxs_log_target_t target) bool mxs_log_init2(const char* ident, const char* logdir, mxs_log_target_t target,
size_t (*gc)(char*, size_t))
{ {
static bool log_init_done = false; static bool log_init_done = false;
ss_dassert(!log_init_done); ss_dassert(!log_init_done);
@ -342,10 +362,16 @@ bool mxs_log_init(const char* ident, const char* logdir, mxs_log_target_t target
break; break;
} }
get_context = gc;
return logger && message_registry; return logger && message_registry;
} }
bool mxs_log_init(const char* ident, const char* logdir, mxs_log_target_t target)
{
return mxs_log_init2(ident, logdir, target, mxs_get_context);
}
/** /**
* End log manager * End log manager
*/ */
@ -718,19 +744,17 @@ int mxs_log_message(int priority,
{ {
va_list valist; va_list valist;
uint64_t session_id = session_get_current_id(); char context[32]; // The documentation will guarantee a buffer of at least 32 bytes.
int session_len = 0; int context_len = 0;
char session[20]; // Enough to fit "9223372036854775807" if (get_context)
if (session_id != 0)
{ {
sprintf(session, "%" PRIu64, session_id); context_len = get_context(context, sizeof(context));
session_len = strlen(session) + 3; // +3 due to "() "
if (context_len != 0)
{
context_len += 3; // The added "() "
} }
else
{
session_len = 0;
} }
int modname_len = modname ? strlen(modname) + 3 : 0; // +3 due to "[...] " int modname_len = modname ? strlen(modname) + 3 : 0; // +3 due to "[...] "
@ -778,7 +802,7 @@ int mxs_log_message(int priority,
int buffer_len = 0; int buffer_len = 0;
buffer_len += prefix.len; buffer_len += prefix.len;
buffer_len += session_len; buffer_len += context_len;
buffer_len += modname_len; buffer_len += modname_len;
buffer_len += augmentation_len; buffer_len += augmentation_len;
buffer_len += message_len; buffer_len += message_len;
@ -790,26 +814,26 @@ int mxs_log_message(int priority,
message_len -= (buffer_len - MAX_LOGSTRLEN); message_len -= (buffer_len - MAX_LOGSTRLEN);
buffer_len = MAX_LOGSTRLEN; buffer_len = MAX_LOGSTRLEN;
ss_dassert(prefix.len + session_len + modname_len + ss_dassert(prefix.len + context_len + modname_len +
augmentation_len + message_len + suppression_len + 1 == buffer_len); augmentation_len + message_len + suppression_len + 1 == buffer_len);
} }
char buffer[buffer_len]; char buffer[buffer_len];
char *prefix_text = buffer; char *prefix_text = buffer;
char *session_text = prefix_text + prefix.len; char *context_text = prefix_text + prefix.len;
char *modname_text = session_text + session_len; char *modname_text = context_text + context_len;
char *augmentation_text = modname_text + modname_len; char *augmentation_text = modname_text + modname_len;
char *message_text = augmentation_text + augmentation_len; char *message_text = augmentation_text + augmentation_len;
char *suppression_text = message_text + message_len; char *suppression_text = message_text + message_len;
strcpy(prefix_text, prefix.text); strcpy(prefix_text, prefix.text);
if (session_len) if (context_len)
{ {
strcpy(session_text, "("); strcpy(context_text, "(");
strcat(session_text, session); strcat(context_text, context);
strcat(session_text, ") "); strcat(context_text, ") ");
} }
if (modname_len) if (modname_len)
@ -849,7 +873,7 @@ int mxs_log_message(int priority,
if (log_config.do_syslog && LOG_PRI(priority) != LOG_DEBUG) if (log_config.do_syslog && LOG_PRI(priority) != LOG_DEBUG)
{ {
// Debug messages are never logged into syslog // Debug messages are never logged into syslog
syslog(priority, "%s", session_text); syslog(priority, "%s", context_text);
} }
err = log_write(priority, buffer); err = log_write(priority, buffer);