diff --git a/Documentation/Getting-Started/Configuration-Guide.md b/Documentation/Getting-Started/Configuration-Guide.md index a10d8d7fd..c23c61f56 100644 --- a/Documentation/Getting-Started/Configuration-Guide.md +++ b/Documentation/Getting-Started/Configuration-Guide.md @@ -974,6 +974,22 @@ Note that you need to specify with `retain_last_statements` how many statements MaxScale should retain for each session. Unless it has been set to another value than `0`, this configuration setting will not have an effect. +### `session_trace` + +How many log entries are stored in the session specific trace log. This log is +written to disk when a session ends abnormally and can be used for debugging +purposes. It would be good to enable this if a session is disconnected and the +log is not detailed enough. In this case the info log might reveal the true +cause of why the connection was closed. + +``` +session_trace=20 +``` +Default is `0`. + +The session trace log is also exposed by REST API and is shown with +`maxctrl show sessions`. + ### `writeq_high_water` High water mark for network write buffer. Controls when network traffic diff --git a/include/maxscale/config.hh b/include/maxscale/config.hh index 335a641e0..917ff0f99 100644 --- a/include/maxscale/config.hh +++ b/include/maxscale/config.hh @@ -191,6 +191,7 @@ extern const char CN_SERVICE[]; extern const char CN_SERVICES[]; extern const char CN_SESSION_TRACK_TRX_STATE[]; extern const char CN_SESSIONS[]; +extern const char CN_SESSION_TRACE[]; extern const char CN_SKIP_PERMISSION_CHECKS[]; extern const char CN_SOCKET[]; extern const char CN_SSL_CA_CERT[]; diff --git a/server/core/config.cc b/server/core/config.cc index 7ca0818d7..b6ba206f3 100644 --- a/server/core/config.cc +++ b/server/core/config.cc @@ -4642,6 +4642,7 @@ json_t* config_maxscale_to_json(const char* host) json_object_set_new(param, CN_RETAIN_LAST_STATEMENTS, json_integer(session_get_retain_last_statements())); json_object_set_new(param, CN_DUMP_LAST_STATEMENTS, json_string(session_get_dump_statements_str())); + json_object_set_new(param, CN_SESSION_TRACE, json_integer(session_get_session_trace())); json_object_set_new(param, CN_LOAD_PERSISTED_CONFIGS, json_boolean(cnf->load_persisted_configs)); json_object_set_new(param, CN_MAX_AUTH_ERRORS_UNTIL_BLOCK, json_integer(cnf->max_auth_errors_until_block)); diff --git a/server/core/config_runtime.cc b/server/core/config_runtime.cc index 82a729e63..52934d148 100644 --- a/server/core/config_runtime.cc +++ b/server/core/config_runtime.cc @@ -943,6 +943,23 @@ bool runtime_alter_maxscale(const char* name, const char* value) config_runtime_error("Invalid value for '%s': %s", CN_MAX_AUTH_ERRORS_UNTIL_BLOCK, value); } } + else if (key == CN_SESSION_TRACE) + { + char* endptr; + long intval = strtol(value, &endptr, 10); + + if (*endptr == '\0' && intval >= 0) + { + session_set_session_trace(intval); + mxb_log_set_session_trace(true); + rval = true; + } + else + { + rval = false; + config_runtime_error("Invalid value for '%s': %s", CN_SESSION_TRACE, value); + } + } else if (config_can_modify_at_runtime(key.c_str())) { config_runtime_error("Global parameter '%s' cannot be modified at runtime", name);