2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-13 14:07:02 +00:00

vlog: New vlog/enable-rate-limit and vlog/disable-rate-limit commands.

A few times while troubleshooting it would have been useful to get
complete logs, rather than post-rate-limiting snapshots of them.  These
ovs-appctl commands make that possible.

Signed-off-by: Ben Pfaff <blp@nicira.com>
This commit is contained in:
Ben Pfaff
2012-12-08 12:23:08 -08:00
parent 2517bad92e
commit 93161ce949
4 changed files with 99 additions and 8 deletions

2
NEWS
View File

@@ -2,6 +2,8 @@ post-v1.9.0
--------------------
- New support for the VXLAN tunnel protocol (see the IETF draft here:
http://tools.ietf.org/html/draft-mahalingam-dutt-dcops-vxlan-02).
- New "vlog/disable-rate-limit" and "vlog/enable-rate-limit" commands
available through ovs-appctl allow control over logging rate limits.
v1.9.0 - xx xxx xxxx

View File

@@ -1,3 +1,8 @@
.de IQ
. br
. ns
. IP "\\$1"
..
.SS "VLOG COMMANDS"
These commands manage \fB\*(PN\fR's logging settings.
.IP "\fBvlog/set\fR [\fIspec\fR]"
@@ -48,3 +53,20 @@ after rotating log files, to cause a new log file to be used.)
.IP
This has no effect unless \fB\*(PN\fR was invoked with the
\fB\-\-log\-file\fR option.
.
.IP "\fBvlog/disable\-rate\-limit \fR[\fImodule\fR]..."
.IQ "\fBvlog/enable\-rate\-limit \fR[\fImodule\fR]..."
By default, \fB\*(PN\fR limits the rate at which certain messages can
be logged. When a message would appear more frequently than the
limit, it is suppressed. This saves disk space, makes logs easier to
read, and speeds up execution, but occasionally troubleshooting
requires more detail. Therefore, \fBvlog/disable\-rate\-limit\fR
allows rate limits to be disabled at the level of an individual log
module. Specify one or more module names, as displayed by the
\fBvlog/list\fR command. Specifying either no module names at all or
the keyword \fBany\fR disables rate limits for every log module.
.
.IP
The \fBvlog/enable\-rate\-limit\fR command, whose syntax is the same
as \fBvlog/disable\-rate\-limit\fR, can be used to re-enable a rate
limit that was previously disabled.

View File

@@ -480,6 +480,55 @@ vlog_unixctl_reopen(struct unixctl_conn *conn, int argc OVS_UNUSED,
}
}
static void
set_all_rate_limits(bool enable)
{
struct vlog_module **mp;
for (mp = vlog_modules; mp < &vlog_modules[n_vlog_modules]; mp++) {
(*mp)->honor_rate_limits = enable;
}
}
static void
set_rate_limits(struct unixctl_conn *conn, int argc,
const char *argv[], bool enable)
{
if (argc > 1) {
int i;
for (i = 1; i < argc; i++) {
if (!strcasecmp(argv[i], "ANY")) {
set_all_rate_limits(enable);
} else {
struct vlog_module *module = vlog_module_from_name(argv[i]);
if (!module) {
unixctl_command_reply_error(conn, "unknown module");
return;
}
module->honor_rate_limits = enable;
}
}
} else {
set_all_rate_limits(enable);
}
unixctl_command_reply(conn, NULL);
}
static void
vlog_enable_rate_limit(struct unixctl_conn *conn, int argc,
const char *argv[], void *aux OVS_UNUSED)
{
set_rate_limits(conn, argc, argv, true);
}
static void
vlog_disable_rate_limit(struct unixctl_conn *conn, int argc,
const char *argv[], void *aux OVS_UNUSED)
{
set_rate_limits(conn, argc, argv, false);
}
/* Initializes the logging subsystem and registers its unixctl server
* commands. */
void
@@ -515,6 +564,10 @@ vlog_init(void)
"vlog/set", "{spec | PATTERN:facility:pattern}",
1, INT_MAX, vlog_unixctl_set, NULL);
unixctl_command_register("vlog/list", "", 0, 0, vlog_unixctl_list, NULL);
unixctl_command_register("vlog/enable-rate-limit", "[module]...",
0, INT_MAX, vlog_enable_rate_limit, NULL);
unixctl_command_register("vlog/disable-rate-limit", "[module]...",
0, INT_MAX, vlog_disable_rate_limit, NULL);
unixctl_command_register("vlog/reopen", "", 0, 0,
vlog_unixctl_reopen, NULL);
}
@@ -543,12 +596,20 @@ vlog_get_levels(void)
ds_put_format(&s, " ------- ------ ------\n");
for (mp = vlog_modules; mp < &vlog_modules[n_vlog_modules]; mp++) {
line = xasprintf("%-16s %4s %4s %4s\n",
vlog_get_module_name(*mp),
vlog_get_level_name(vlog_get_level(*mp, VLF_CONSOLE)),
vlog_get_level_name(vlog_get_level(*mp, VLF_SYSLOG)),
vlog_get_level_name(vlog_get_level(*mp, VLF_FILE)));
svec_add_nocopy(&lines, line);
struct ds line;
ds_init(&line);
ds_put_format(&line, "%-16s %4s %4s %4s",
vlog_get_module_name(*mp),
vlog_get_level_name(vlog_get_level(*mp, VLF_CONSOLE)),
vlog_get_level_name(vlog_get_level(*mp, VLF_SYSLOG)),
vlog_get_level_name(vlog_get_level(*mp, VLF_FILE)));
if (!(*mp)->honor_rate_limits) {
ds_put_cstr(&line, " (rate limiting disabled)");
}
ds_put_char(&line, '\n');
svec_add_nocopy(&lines, ds_steal_cstr(&line));
}
svec_sort(&lines);
@@ -826,6 +887,10 @@ bool
vlog_should_drop(const struct vlog_module *module, enum vlog_level level,
struct vlog_rate_limit *rl)
{
if (!module->honor_rate_limits) {
return false;
}
if (!vlog_is_enabled(module, level)) {
return true;
}

View File

@@ -71,6 +71,7 @@ struct vlog_module {
const char *name; /* User-visible name. */
int levels[VLF_N_FACILITIES]; /* Minimum log level for each facility. */
int min_level; /* Minimum log level for any facility. */
bool honor_rate_limits; /* Set false to ignore rate limits. */
};
/* Creates and initializes a global instance of a module named MODULE. */
@@ -241,9 +242,10 @@ void vlog_usage(void);
extern struct vlog_module VLM_##MODULE; \
struct vlog_module VLM_##MODULE = \
{ \
#MODULE, /* name */ \
#MODULE, /* name */ \
{ [ 0 ... VLF_N_FACILITIES - 1] = VLL_INFO }, /* levels */ \
VLL_INFO, /* min_level */ \
VLL_INFO, /* min_level */ \
true /* honor_rate_limits */ \
};
#ifdef __cplusplus