interface: move vnet_pcap_t to vnet
[vpp.git] / src / vlib / log.h
index bc73c1c..c3ebb81 100644 (file)
 #ifndef included_vlib_log_h
 #define included_vlib_log_h
 
+#include <sys/time.h>
 #include <vppinfra/types.h>
 
-typedef u32 vlib_log_class_t;
-
-#define foreach_vlib_log_level \
-  _(0, EMERG, emerg) \
-  _(1, ALERT, alert) \
-  _(2, CRIT, crit) \
-  _(3, ERR, err) \
-  _(4, WARNING, warn) \
-  _(5, NOTICE, notice) \
-  _(6, INFO, info) \
-  _(7, DEBUG, debug) \
-  _(8, DISABLED, disabled)
+#define foreach_vlib_log_level \
+  _(EMERG, emerg)              \
+  _(ALERT, alert)              \
+  _(CRIT, crit)                        \
+  _(ERR, error)                        \
+  _(WARNING, warn)             \
+  _(NOTICE, notice)            \
+  _(INFO, info)                        \
+  _(DEBUG, debug)              \
+  _(DISABLED, disabled)
 
 typedef enum
 {
-#define _(n,uc,lc) VLIB_LOG_LEVEL_##uc = n,
+  VLIB_LOG_LEVEL_UNKNOWN = 0,
+#define _(uc,lc) VLIB_LOG_LEVEL_##uc,
   foreach_vlib_log_level
 #undef _
+    VLIB_LOG_N_LEVELS,
 } vlib_log_level_t;
 
+typedef struct
+{
+  vlib_log_level_t level;
+  vlib_log_class_t class;
+  f64 timestamp;
+  u8 *string;
+} vlib_log_entry_t;
+
+typedef struct
+{
+  u32 index;
+  u8 *name;
+  // level of log messages kept for this subclass
+  vlib_log_level_t level;
+  // level of log messages sent to syslog for this subclass
+  vlib_log_level_t syslog_level;
+  // flag saying whether this subclass is logged to syslog
+  f64 last_event_timestamp;
+  int last_sec_count;
+  int is_throttling;
+  int rate_limit;
+} vlib_log_subclass_data_t;
+
+typedef struct
+{
+  u32 index;
+  u8 *name;
+  vlib_log_subclass_data_t *subclasses;
+} vlib_log_class_data_t;
+
+typedef struct
+{
+  vlib_log_level_t level;
+  vlib_log_level_t syslog_level;
+  int rate_limit;
+  char *name;
+} vlib_log_class_config_t;
+
+
+typedef struct vlib_log_registration
+{
+  char *class_name;
+  char *subclass_name;
+  vlib_log_class_t class;
+  vlib_log_level_t default_level;
+  vlib_log_level_t default_syslog_level;
+
+  /* next */
+  struct vlib_log_registration *next;
+} vlib_log_class_registration_t;
+
+typedef struct
+{
+  vlib_log_entry_t *entries;
+  vlib_log_class_data_t *classes;
+  int size, next, count;
+
+  int default_rate_limit;
+  int default_log_level;
+  int default_syslog_log_level;
+  int unthrottle_time;
+  u32 max_class_name_length;
+
+  /* time zero */
+  struct timeval time_zero_timeval;
+  f64 time_zero;
+
+  /* config */
+  vlib_log_class_config_t *configs;
+  uword *config_index_by_name;
+  int add_to_elog;
+
+  /* registrations */
+  vlib_log_class_registration_t *registrations;
+} vlib_log_main_t;
+
+extern vlib_log_main_t log_main;
 
 vlib_log_class_t vlib_log_register_class (char *vlass, char *subclass);
-u32 vlib_log_get_indent ();
+vlib_log_class_t
+vlib_log_register_class_rate_limit (char *class, char *subclass,
+                                   u32 rate_limit);
 void vlib_log (vlib_log_level_t level, vlib_log_class_t class, char *fmt,
               ...);
+int last_log_entry ();
+u8 *format_vlib_log_class (u8 * s, va_list * args);
+u8 *format_vlib_log_level (u8 * s, va_list * args);
 
 #define vlib_log_emerg(...) vlib_log(VLIB_LOG_LEVEL_EMERG, __VA_ARGS__)
 #define vlib_log_alert(...) vlib_log(VLIB_LOG_LEVEL_ALERT, __VA_ARGS__)
 #define vlib_log_crit(...) vlib_log(VLIB_LOG_LEVEL_CRIT, __VA_ARGS__)
 #define vlib_log_err(...) vlib_log(VLIB_LOG_LEVEL_ERR, __VA_ARGS__)
-#define vlib_log_warn(...) vlib_log(VLIB_LOG_LEVEL_WARN, __VA_ARGS__)
+#define vlib_log_warn(...) vlib_log(VLIB_LOG_LEVEL_WARNING, __VA_ARGS__)
 #define vlib_log_notice(...) vlib_log(VLIB_LOG_LEVEL_NOTICE, __VA_ARGS__)
 #define vlib_log_info(...) vlib_log(VLIB_LOG_LEVEL_INFO, __VA_ARGS__)
 #define vlib_log_debug(...) vlib_log(VLIB_LOG_LEVEL_DEBUG, __VA_ARGS__)
 
+#define VLIB_REGISTER_LOG_CLASS(x,...) \
+__VA_ARGS__ vlib_log_class_registration_t x; \
+static void __clib_constructor                 \
+__vlib_add_log_registration_##x (void)         \
+  {                                            \
+    vlib_log_main_t * lm = &log_main;          \
+    x.next = lm->registrations;                        \
+    x.class = ~0;                              \
+    lm->registrations = &x;                    \
+  }                                            \
+__VA_ARGS__  vlib_log_class_registration_t x
+
 #endif /* included_vlib_log_h */
 
 /*