MXS-2592 Add configuration for session specific in-memory log

When enabled each session will write log messages in the in-memory log.
If session ends in error this log is written to the actual log in disk.
This commit is contained in:
Marko
2019-07-24 18:29:58 +03:00
parent b07ffdb2fa
commit 918a2964d5
14 changed files with 176 additions and 16 deletions

View File

@ -85,6 +85,8 @@ typedef struct MXB_LOG_THROTTLING
*/
typedef size_t (* mxb_log_context_provider_t)(char* buffer, size_t len);
typedef void (* mxb_in_memory_log_t)(const char* buffer, size_t len);
/**
* @brief Initialize the log
*
@ -105,7 +107,8 @@ bool mxb_log_init(const char* ident,
const char* logdir,
const char* filename,
mxb_log_target_t target,
mxb_log_context_provider_t context_provider);
mxb_log_context_provider_t context_provider,
mxb_in_memory_log_t in_memory_log);
/**
* @brief Finalize the log
@ -150,6 +153,8 @@ const char* mxb_log_get_filename();
*/
bool mxb_log_set_priority_enabled(int priority, bool enabled);
bool mxb_log_get_session_trace();
/**
* Query whether a particular syslog priority is enabled.
*
@ -233,6 +238,14 @@ void mxb_log_get_throttling(MXB_LOG_THROTTLING* throttling);
*/
void mxs_log_redirect_stdout(bool redirect);
/**
* Set session specific in-memory log
*
* @param enabled True or false to enable or disable session in-memory logging
*/
void mxb_log_set_session_trace(bool enabled);
/**
* Log a message of a particular priority.
*
@ -278,7 +291,7 @@ int mxb_log_oom(const char* message);
* MXB_ERROR, MXB_WARNING, etc. macros instead.
*/
#define MXB_LOG_MESSAGE(priority, format, ...) \
(mxb_log_is_priority_enabled(priority) \
(mxb_log_is_priority_enabled(priority) || mxb_log_get_session_trace() \
? mxb_log_message(priority, MXB_MODULE_NAME, __FILE__, __LINE__, __func__, format, ##__VA_ARGS__) \
: 0)

View File

@ -30,7 +30,7 @@
*/
inline bool mxb_log_init(mxb_log_target_t target = MXB_LOG_TARGET_FS)
{
return mxb_log_init(nullptr, ".", nullptr, target, nullptr);
return mxb_log_init(nullptr, ".", nullptr, target, nullptr, nullptr);
}
namespace maxbase
@ -52,16 +52,17 @@ public:
const char* logdir,
const char* filename,
mxb_log_target_t target,
mxb_log_context_provider_t context_provider)
mxb_log_context_provider_t context_provider,
mxb_in_memory_log_t in_memory_log)
{
if (!mxb_log_init(ident, logdir, filename, target, context_provider))
if (!mxb_log_init(ident, logdir, filename, target, context_provider, in_memory_log))
{
throw std::runtime_error("Failed to initialize the log.");
}
}
Log(mxb_log_target_t target = MXB_LOG_TARGET_FS)
: Log(nullptr, ".", nullptr, target, nullptr)
: Log(nullptr, ".", nullptr, target, nullptr, nullptr)
{
}

View File

@ -78,7 +78,8 @@ public:
const char* zLogdir,
const char* zFilename,
mxb_log_target_t target,
mxb_log_context_provider_t context_provider);
mxb_log_context_provider_t context_provider,
mxb_in_memory_log_t in_memory_log);
/**
* @brief Initializes MaxBase and the MaxBase log.
@ -88,7 +89,7 @@ public:
* @throws std::runtime_error if the initialization failed.
*/
MaxBase(mxb_log_target_t target)
: MaxBase(nullptr, ".", nullptr, target, nullptr)
: MaxBase(nullptr, ".", nullptr, target, nullptr, nullptr)
{
}

View File

@ -386,10 +386,12 @@ struct this_unit
bool do_syslog; // Can change during the lifetime of log_manager.
bool do_maxlog; // Can change during the lifetime of log_manager.
bool redirect_stdout;
bool session_trace;
MXB_LOG_THROTTLING throttling; // Can change during the lifetime of log_manager.
std::unique_ptr<mxb::Logger> sLogger;
std::unique_ptr<MessageRegistry> sMessage_registry;
size_t (* context_provider)(char* buffer, size_t len);
void (* in_memory_log)(const char* buffer, size_t len);
} this_unit =
{
DEFAULT_LOG_AUGMENTATION, // augmentation
@ -397,6 +399,7 @@ struct this_unit
true, // do_syslog
true, // do_maxlog
false, // redirect_stdout
false, // session_trace
DEFAULT_LOG_THROTTLING, // throttling
};
@ -449,7 +452,8 @@ bool mxb_log_init(const char* ident,
const char* logdir,
const char* filename,
mxb_log_target_t target,
mxb_log_context_provider_t context_provider)
mxb_log_context_provider_t context_provider,
mxb_in_memory_log_t in_memory_log)
{
assert(!this_unit.sLogger && !this_unit.sMessage_registry);
@ -511,6 +515,7 @@ bool mxb_log_init(const char* ident,
if (this_unit.sLogger && this_unit.sMessage_registry)
{
this_unit.context_provider = context_provider;
this_unit.in_memory_log = in_memory_log;
openlog(ident, LOG_PID | LOG_ODELAY, LOG_USER);
}
@ -614,6 +619,16 @@ void mxs_log_redirect_stdout(bool redirect)
this_unit.redirect_stdout = redirect;
}
void mxb_log_set_session_trace(bool enabled)
{
this_unit.session_trace = enabled;
}
bool mxb_log_get_session_trace()
{
return this_unit.session_trace;
}
bool mxb_log_rotate()
{
bool rval = this_unit.sLogger->rotate();
@ -874,7 +889,19 @@ int mxb_log_message(int priority,
// Add a final newline into the message
msg.push_back('\n');
err = this_unit.sLogger->write(msg.c_str(), msg.length()) ? 0 : -1;
if (this_unit.session_trace)
{
this_unit.in_memory_log(msg.c_str(), msg.length());
}
if (mxb_log_is_priority_enabled(priority))
{
err = this_unit.sLogger->write(msg.c_str(), msg.length()) ? 0 : -1;
}
else
{
err = 0;
}
}
}
}

View File

@ -92,14 +92,15 @@ MaxBase::MaxBase(const char* zIdent,
const char* zLogdir,
const char* zFilename,
mxb_log_target_t target,
mxb_log_context_provider_t context_provider)
mxb_log_context_provider_t context_provider,
mxb_in_memory_log_t in_memory_log)
: m_log_inited(false)
{
const char* zMessage = nullptr;
if (maxbase::init())
{
m_log_inited = mxb_log_init(zIdent, zLogdir, zFilename, target, context_provider);
m_log_inited = mxb_log_init(zIdent, zLogdir, zFilename, target, context_provider, in_memory_log);
if (!m_log_inited)
{