X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fvlog.c;h=11b2f7cc4ef48be324b4f90412ff1fef40995432;hb=799d2bfaad0afb53131f8071281c9018a74fa35f;hp=265e9c6dd0bc914b53d27bb2f5b4db7a3538b45f;hpb=8628b0b71d1cf5b3bd7425e50f0aa1435aa38804;p=sliver-openvswitch.git diff --git a/lib/vlog.c b/lib/vlog.c index 265e9c6dd..11b2f7cc4 100644 --- a/lib/vlog.c +++ b/lib/vlog.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -186,7 +187,7 @@ update_min_level(struct vlog_module *module) { enum vlog_facility facility; - module->min_level = VLL_EMER; + module->min_level = VLL_OFF; for (facility = 0; facility < VLF_N_FACILITIES; facility++) { if (log_file || facility != VLF_FILE) { enum vlog_level level = module->levels[facility]; @@ -322,7 +323,25 @@ vlog_set_log_file(const char *file_name) int vlog_reopen_log_file(void) { - return log_file_name ? vlog_set_log_file(log_file_name) : 0; + struct stat old, new; + + /* Skip re-opening if there's nothing to reopen. */ + if (!log_file_name) { + return 0; + } + + /* Skip re-opening if it would be a no-op because the old and new files are + * the same. (This avoids writing "closing log file" followed immediately + * by "opened log file".) */ + if (log_file + && !fstat(fileno(log_file), &old) + && !stat(log_file_name, &new) + && old.st_dev == new.st_dev + && old.st_ino == new.st_ino) { + return 0; + } + + return vlog_set_log_file(log_file_name); } /* Set debugging levels: @@ -346,7 +365,7 @@ vlog_set_levels_from_string(const char *s_) facility = strtok_r(NULL, ":", &save_ptr); - if (!facility || !strcmp(facility, "ANY")) { + if (!facility || !strcasecmp(facility, "ANY")) { e_facility = VLF_ANY_FACILITY; } else { e_facility = vlog_get_facility_val(facility); @@ -357,14 +376,14 @@ vlog_set_levels_from_string(const char *s_) } } - if (!strcmp(module, "PATTERN")) { + if (!strcasecmp(module, "PATTERN")) { vlog_set_pattern(e_facility, save_ptr); break; } else { char *level; enum vlog_level e_level; - if (!strcmp(module, "ANY")) { + if (!strcasecmp(module, "ANY")) { e_module = NULL; } else { e_module = vlog_module_from_name(module); @@ -464,9 +483,11 @@ vlog_init(void) VLOG_ERR("current time is negative: %s (%ld)", s, (long int) now); } - unixctl_command_register("vlog/set", vlog_unixctl_set, NULL); - unixctl_command_register("vlog/list", vlog_unixctl_list, NULL); - unixctl_command_register("vlog/reopen", vlog_unixctl_reopen, NULL); + unixctl_command_register("vlog/set", + "{module[:facility[:level]] | PATTERN:facility:pattern}", + vlog_unixctl_set, NULL); + unixctl_command_register("vlog/list", "", vlog_unixctl_list, NULL); + unixctl_command_register("vlog/reopen", "", vlog_unixctl_reopen, NULL); } /* Closes the logging subsystem. */ @@ -692,27 +713,26 @@ vlog(const struct vlog_module *module, enum vlog_level level, } void -vlog_fatal_valist(const struct vlog_module *module_, enum vlog_level level, +vlog_fatal_valist(const struct vlog_module *module_, const char *message, va_list args) { struct vlog_module *module = (struct vlog_module *) module_; /* Don't log this message to the console to avoid redundancy with the * message written by the later ovs_fatal_valist(). */ - module->levels[VLF_CONSOLE] = VLL_EMER; + module->levels[VLF_CONSOLE] = VLL_OFF; - vlog_valist(module, level, message, args); + vlog_valist(module, VLL_EMER, message, args); ovs_fatal_valist(0, message, args); } void -vlog_fatal(const struct vlog_module *module, enum vlog_level level, - const char *message, ...) +vlog_fatal(const struct vlog_module *module, const char *message, ...) { va_list args; va_start(args, message); - vlog_fatal_valist(module, level, message, args); + vlog_fatal_valist(module, message, args); va_end(args); } @@ -740,6 +760,7 @@ vlog_should_drop(const struct vlog_module *module, enum vlog_level level, if (!rl->n_dropped) { rl->first_dropped = now; } + rl->last_dropped = now; rl->n_dropped++; return true; } @@ -747,10 +768,15 @@ vlog_should_drop(const struct vlog_module *module, enum vlog_level level, rl->tokens -= VLOG_MSG_TOKENS; if (rl->n_dropped) { + time_t now = time_now(); + unsigned int first_dropped_elapsed = now - rl->first_dropped; + unsigned int last_dropped_elapsed = now - rl->last_dropped; + vlog(module, level, - "Dropped %u log messages in last %u seconds " - "due to excessive rate", - rl->n_dropped, (unsigned int) (time_now() - rl->first_dropped)); + "Dropped %u log messages in last %u seconds (most recently, " + "%u seconds ago) due to excessive rate", + rl->n_dropped, first_dropped_elapsed, last_dropped_elapsed); + rl->n_dropped = 0; } return false;