+.de IQ
+. br
+. ns
+. IP "\\$1"
+..
.SS "VLOG COMMANDS"
These commands manage \fB\*(PN\fR's logging settings.
.IP "\fBvlog/set\fR [\fIspec\fR]"
.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.
}
}
+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
"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);
}
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);
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;
}