X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fvlog.h;h=0f791af1ae714934b5873c6f43ae5213ce9636cd;hb=28c5588e8e1a8d091c5d2275232c35f2968a97fa;hp=eeec5fce74b16884c073e39c754917ca23cdaf68;hpb=f1de299e0cee4b438e8d2b535c14ffbb75309a09;p=sliver-openvswitch.git diff --git a/lib/vlog.h b/lib/vlog.h index eeec5fce7..0f791af1a 100644 --- a/lib/vlog.h +++ b/lib/vlog.h @@ -17,6 +17,15 @@ #ifndef VLOG_H #define VLOG_H 1 +/* Logging. + * + * + * Thread-safety + * ============= + * + * Fully thread safe. + */ + #include #include #include @@ -26,6 +35,7 @@ #include "sat-math.h" #include "token-bucket.h" #include "util.h" +#include "list.h" #ifdef __cplusplus extern "C" { @@ -35,14 +45,14 @@ extern "C" { * * ovs-appctl(8) defines each of the log levels. */ #define VLOG_LEVELS \ - VLOG_LEVEL(OFF, LOG_ALERT) \ - VLOG_LEVEL(EMER, LOG_ALERT) \ - VLOG_LEVEL(ERR, LOG_ERR) \ - VLOG_LEVEL(WARN, LOG_WARNING) \ - VLOG_LEVEL(INFO, LOG_NOTICE) \ - VLOG_LEVEL(DBG, LOG_DEBUG) + VLOG_LEVEL(OFF, LOG_ALERT, 1) \ + VLOG_LEVEL(EMER, LOG_ALERT, 1) \ + VLOG_LEVEL(ERR, LOG_ERR, 3) \ + VLOG_LEVEL(WARN, LOG_WARNING, 4) \ + VLOG_LEVEL(INFO, LOG_NOTICE, 5) \ + VLOG_LEVEL(DBG, LOG_DEBUG, 7) enum vlog_level { -#define VLOG_LEVEL(NAME, SYSLOG_LEVEL) VLL_##NAME, +#define VLOG_LEVEL(NAME, SYSLOG_LEVEL, RFC5424_LEVEL) VLL_##NAME, VLOG_LEVELS #undef VLOG_LEVEL VLL_N_LEVELS @@ -53,9 +63,9 @@ enum vlog_level vlog_get_level_val(const char *name); /* Facilities that we can log to. */ #define VLOG_FACILITIES \ - VLOG_FACILITY(SYSLOG, "ovs|%05N|%c%T|%p|%m") \ + VLOG_FACILITY(SYSLOG, "ovs|%05N|%c%T|%p|%m") \ VLOG_FACILITY(CONSOLE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m") \ - VLOG_FACILITY(FILE, "%D{%Y-%m-%dT%H:%M:%SZ}|%05N|%c%T|%p|%m") + VLOG_FACILITY(FILE, "%D{%Y-%m-%dT%H:%M:%S.###Z}|%05N|%c%T|%p|%m") enum vlog_facility { #define VLOG_FACILITY(NAME, PATTERN) VLF_##NAME, VLOG_FACILITIES @@ -69,22 +79,22 @@ enum vlog_facility vlog_get_facility_val(const char *name); /* A log module. */ struct vlog_module { + struct list list; 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. */ }; +/* Global list of all logging modules */ +extern struct list vlog_modules; + /* Creates and initializes a global instance of a module named MODULE. */ -#if USE_LINKER_SECTIONS #define VLOG_DEFINE_MODULE(MODULE) \ VLOG_DEFINE_MODULE__(MODULE) \ - extern struct vlog_module *vlog_module_ptr_##MODULE; \ - struct vlog_module *vlog_module_ptr_##MODULE \ - __attribute__((section("vlog_modules"))) = &VLM_##MODULE -#else -#define VLOG_DEFINE_MODULE(MODULE) extern struct vlog_module VLM_##MODULE -#endif + OVS_CONSTRUCTOR(init_##MODULE) { \ + list_insert(&vlog_modules, &VLM_##MODULE.list); \ + } \ const char *vlog_get_module_name(const struct vlog_module *); struct vlog_module *vlog_module_from_name(const char *name); @@ -95,7 +105,7 @@ struct vlog_rate_limit { time_t first_dropped; /* Time first message was dropped. */ time_t last_dropped; /* Time of most recent message drop. */ unsigned int n_dropped; /* Number of messages dropped. */ - pthread_mutex_t mutex; /* Mutual exclusion for rate limit. */ + struct ovs_mutex mutex; /* Mutual exclusion for rate limit. */ }; /* Number of tokens to emit a message. We add 'rate' tokens per millisecond, @@ -110,7 +120,7 @@ struct vlog_rate_limit { 0, /* first_dropped */ \ 0, /* last_dropped */ \ 0, /* n_dropped */ \ - PTHREAD_ADAPTIVE_MUTEX_INITIALIZER /* mutex */ \ + OVS_MUTEX_INITIALIZER /* mutex */ \ } /* Configuring how each module logs messages. */ @@ -130,8 +140,12 @@ void vlog_set_pattern(enum vlog_facility, const char *pattern); int vlog_set_log_file(const char *file_name); int vlog_reopen_log_file(void); +/* Configure syslog target. */ +void vlog_set_syslog_target(const char *target); + /* Initialization. */ void vlog_init(void); +void vlog_enable_async(void); /* Functions for actual logging. */ void vlog(const struct vlog_module *, enum vlog_level, const char *format, ...) @@ -203,17 +217,26 @@ void vlog_rate_limit(const struct vlog_module *, enum vlog_level, #define VLOG_DBG_ONCE(...) VLOG_ONCE(VLL_DBG, __VA_ARGS__) /* Command line processing. */ -#define VLOG_OPTION_ENUMS OPT_LOG_FILE -#define VLOG_LONG_OPTIONS \ - {"verbose", optional_argument, NULL, 'v'}, \ - {"log-file", optional_argument, NULL, OPT_LOG_FILE} +#define VLOG_OPTION_ENUMS \ + OPT_LOG_FILE, \ + OPT_SYSLOG_TARGET + +#define VLOG_LONG_OPTIONS \ + {"verbose", optional_argument, NULL, 'v'}, \ + {"log-file", optional_argument, NULL, OPT_LOG_FILE}, \ + {"syslog-target", optional_argument, NULL, OPT_SYSLOG_TARGET} + #define VLOG_OPTION_HANDLERS \ case 'v': \ vlog_set_verbosity(optarg); \ break; \ case OPT_LOG_FILE: \ vlog_set_log_file(optarg); \ + break; \ + case OPT_SYSLOG_TARGET: \ + vlog_set_syslog_target(optarg); \ break; + void vlog_usage(void); /* Implementation details. */ @@ -244,8 +267,9 @@ void vlog_usage(void); extern struct vlog_module VLM_##MODULE; \ struct vlog_module VLM_##MODULE = \ { \ + LIST_INITIALIZER(&VLM_##MODULE.list), \ #MODULE, /* name */ \ - { [ 0 ... VLF_N_FACILITIES - 1] = VLL_INFO }, /* levels */ \ + { VLL_INFO, VLL_INFO, VLL_INFO }, /* levels */ \ VLL_INFO, /* min_level */ \ true /* honor_rate_limits */ \ };