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:
2
NEWS
2
NEWS
@@ -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
|
||||
|
@@ -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.
|
||||
|
77
lib/vlog.c
77
lib/vlog.c
@@ -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;
|
||||
}
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user