Improve the command interface so that it sends back acks or errors.
[sliver-openvswitch.git] / include / vlog.h
index 7582681..350475b 100644 (file)
 #include "util.h"
 
 /* Logging importance levels. */
+#define VLOG_LEVELS                             \
+    VLOG_LEVEL(EMER, LOG_ALERT)                 \
+    VLOG_LEVEL(ERR, LOG_ERR)                    \
+    VLOG_LEVEL(WARN, LOG_WARNING)               \
+    VLOG_LEVEL(DBG, LOG_DEBUG)
 enum vlog_level {
-    VLL_EMER,
-    VLL_ERR,
-    VLL_WARN,
-    VLL_DBG,
+#define VLOG_LEVEL(NAME, SYSLOG_LEVEL) VLL_##NAME,
+    VLOG_LEVELS
+#undef VLOG_LEVEL
     VLL_N_LEVELS
 };
 
@@ -53,9 +57,14 @@ const char *vlog_get_level_name(enum vlog_level);
 enum vlog_level vlog_get_level_val(const char *name);
 
 /* Facilities that we can log to. */
+#define VLOG_FACILITIES                                         \
+    VLOG_FACILITY(SYSLOG, "%05N|%c|%p|%m")                      \
+    VLOG_FACILITY(CONSOLE, "%d{%b %d %H:%M:%S}|%05N|%c|%p|%m")  \
+    VLOG_FACILITY(FILE, "%d{%b %d %H:%M:%S}|%05N|%c|%p|%m")
 enum vlog_facility {
-    VLF_SYSLOG,
-    VLF_CONSOLE,
+#define VLOG_FACILITY(NAME, PATTERN) VLF_##NAME,
+    VLOG_FACILITIES
+#undef VLOG_FACILITY
     VLF_N_FACILITIES,
     VLF_ANY_FACILITY = -1
 };
@@ -112,6 +121,12 @@ char *vlog_get_levels(void);
 bool vlog_is_enabled(enum vlog_module, enum vlog_level);
 void vlog_set_verbosity(const char *arg);
 
+/* Configuring log facilities. */
+void vlog_set_pattern(enum vlog_facility, const char *pattern);
+const char *vlog_get_log_file(void);
+int vlog_set_log_file(const char *file_name);
+int vlog_reopen_log_file(void);
+
 /* Function for actual logging. */
 void vlog_init(void);
 void vlog_exit(void);
@@ -129,10 +144,10 @@ void vlog_rate_limit(enum vlog_module, enum vlog_level,
  *      #define THIS_MODULE VLM_netlink
  * Guaranteed to preserve errno.
  */
-#define VLOG_EMER(...) vlog(THIS_MODULE, VLL_EMER, __VA_ARGS__)
-#define VLOG_ERR(...) vlog(THIS_MODULE, VLL_ERR, __VA_ARGS__)
-#define VLOG_WARN(...) vlog(THIS_MODULE, VLL_WARN, __VA_ARGS__)
-#define VLOG_DBG(...) vlog(THIS_MODULE, VLL_DBG, __VA_ARGS__)
+#define VLOG_EMER(...) VLOG(VLL_EMER, __VA_ARGS__)
+#define VLOG_ERR(...) VLOG(VLL_ERR, __VA_ARGS__)
+#define VLOG_WARN(...) VLOG(VLL_WARN, __VA_ARGS__)
+#define VLOG_DBG(...) VLOG(VLL_DBG, __VA_ARGS__)
 
 /* More convenience macros, for testing whether a given level is enabled in
  * THIS_MODULE.  When constructing a log message is expensive, this enables it
@@ -155,4 +170,28 @@ void vlog_rate_limit(enum vlog_module, enum vlog_level,
 #define VLOG_DBG_RL(RL, ...) \
         vlog_rate_limit(THIS_MODULE, VLL_DBG, RL, __VA_ARGS__)
 
+/* Command line processing. */
+#define VLOG_OPTION_ENUMS OPT_LOG_FILE
+#define VLOG_LONG_OPTIONS                                   \
+        {"verbose",     optional_argument, 0, 'v'},         \
+        {"log-file",    optional_argument, 0, OPT_LOG_FILE}
+#define VLOG_OPTION_HANDLERS                    \
+        case 'v':                               \
+            vlog_set_verbosity(optarg);         \
+            break;                              \
+        case OPT_LOG_FILE:                      \
+            vlog_set_log_file(optarg);          \
+            break;
+void vlog_usage(void);
+
+/* Implementation details. */
+#define VLOG(LEVEL, ...)                                \
+    do {                                                \
+        if (min_vlog_levels[THIS_MODULE] >= LEVEL) {    \
+            vlog(THIS_MODULE, LEVEL, __VA_ARGS__);      \
+        }                                               \
+    } while (0)
+extern enum vlog_level min_vlog_levels[VLM_N_MODULES];
+
+
 #endif /* vlog.h */