LCOV - code coverage report
Current view: top level - vlib - log.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 6 6 100.0 %
Date: 2023-10-26 01:39:38 Functions: 2 2 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2018 Cisco and/or its affiliates.
       3             :  * Licensed under the Apache License, Version 2.0 (the "License");
       4             :  * you may not use this file except in compliance with the License.
       5             :  * You may obtain a copy of the License at:
       6             :  *
       7             :  *     http://www.apache.org/licenses/LICENSE-2.0
       8             :  *
       9             :  * Unless required by applicable law or agreed to in writing, software
      10             :  * distributed under the License is distributed on an "AS IS" BASIS,
      11             :  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      12             :  * See the License for the specific language governing permissions and
      13             :  * limitations under the License.
      14             :  */
      15             : 
      16             : #ifndef included_vlib_log_h
      17             : #define included_vlib_log_h
      18             : 
      19             : #include <sys/time.h>
      20             : #include <vppinfra/types.h>
      21             : 
      22             : #define foreach_vlib_log_level  \
      23             :   _(EMERG, emerg)               \
      24             :   _(ALERT, alert)               \
      25             :   _(CRIT, crit)                 \
      26             :   _(ERR, error)                 \
      27             :   _(WARNING, warn)              \
      28             :   _(NOTICE, notice)             \
      29             :   _(INFO, info)                 \
      30             :   _(DEBUG, debug)               \
      31             :   _(DISABLED, disabled)
      32             : 
      33             : typedef enum
      34             : {
      35             :   VLIB_LOG_LEVEL_UNKNOWN = 0,
      36             : #define _(uc,lc) VLIB_LOG_LEVEL_##uc,
      37             :   foreach_vlib_log_level
      38             : #undef _
      39             :     VLIB_LOG_N_LEVELS,
      40             : } vlib_log_level_t;
      41             : 
      42             : typedef struct
      43             : {
      44             :   vlib_log_level_t level;
      45             :   vlib_log_class_t class;
      46             :   f64 timestamp;
      47             :   u8 *string;
      48             : } vlib_log_entry_t;
      49             : 
      50             : typedef struct
      51             : {
      52             :   u32 index;
      53             :   u8 *name;
      54             :   // level of log messages kept for this subclass
      55             :   vlib_log_level_t level;
      56             :   // level of log messages sent to syslog for this subclass
      57             :   vlib_log_level_t syslog_level;
      58             :   // flag saying whether this subclass is logged to syslog
      59             :   f64 last_event_timestamp;
      60             :   int last_sec_count;
      61             :   int is_throttling;
      62             :   int rate_limit;
      63             : } vlib_log_subclass_data_t;
      64             : 
      65             : typedef struct
      66             : {
      67             :   u32 index;
      68             :   u8 *name;
      69             :   vlib_log_subclass_data_t *subclasses;
      70             : } vlib_log_class_data_t;
      71             : 
      72             : typedef struct
      73             : {
      74             :   vlib_log_level_t level;
      75             :   vlib_log_level_t syslog_level;
      76             :   int rate_limit;
      77             :   char *name;
      78             : } vlib_log_class_config_t;
      79             : 
      80             : 
      81             : typedef struct vlib_log_registration
      82             : {
      83             :   char *class_name;
      84             :   char *subclass_name;
      85             :   vlib_log_class_t class;
      86             :   vlib_log_level_t default_level;
      87             :   vlib_log_level_t default_syslog_level;
      88             : 
      89             :   /* next */
      90             :   struct vlib_log_registration *next;
      91             : } vlib_log_class_registration_t;
      92             : 
      93             : typedef struct
      94             : {
      95             :   vlib_log_entry_t *entries;
      96             :   vlib_log_class_data_t *classes;
      97             :   int size, next, count;
      98             : 
      99             :   int default_rate_limit;
     100             :   int default_log_level;
     101             :   int default_syslog_log_level;
     102             :   int unthrottle_time;
     103             :   u32 max_class_name_length;
     104             : 
     105             :   /* time zero */
     106             :   struct timeval time_zero_timeval;
     107             :   f64 time_zero;
     108             : 
     109             :   /* config */
     110             :   vlib_log_class_config_t *configs;
     111             :   uword *config_index_by_name;
     112             :   int add_to_elog;
     113             : 
     114             :   /* registrations */
     115             :   vlib_log_class_registration_t *registrations;
     116             : } vlib_log_main_t;
     117             : 
     118             : extern vlib_log_main_t log_main;
     119             : 
     120             : clib_error_t *vlib_log_init (struct vlib_main_t *vm);
     121             : vlib_log_class_t vlib_log_register_class (char *vlass, char *subclass);
     122             : vlib_log_class_t
     123             : vlib_log_register_class_rate_limit (char *class, char *subclass,
     124             :                                     u32 rate_limit);
     125             : void vlib_log (vlib_log_level_t level, vlib_log_class_t class, char *fmt,
     126             :                ...);
     127             : int last_log_entry ();
     128             : u8 *format_vlib_log_class (u8 * s, va_list * args);
     129             : u8 *format_vlib_log_level (u8 * s, va_list * args);
     130             : 
     131             : #define vlib_log_emerg(...) vlib_log(VLIB_LOG_LEVEL_EMERG, __VA_ARGS__)
     132             : #define vlib_log_alert(...) vlib_log(VLIB_LOG_LEVEL_ALERT, __VA_ARGS__)
     133             : #define vlib_log_crit(...) vlib_log(VLIB_LOG_LEVEL_CRIT, __VA_ARGS__)
     134             : #define vlib_log_err(...) vlib_log(VLIB_LOG_LEVEL_ERR, __VA_ARGS__)
     135             : #define vlib_log_warn(...) vlib_log(VLIB_LOG_LEVEL_WARNING, __VA_ARGS__)
     136             : #define vlib_log_notice(...) vlib_log(VLIB_LOG_LEVEL_NOTICE, __VA_ARGS__)
     137             : #define vlib_log_info(...) vlib_log(VLIB_LOG_LEVEL_INFO, __VA_ARGS__)
     138             : #define vlib_log_debug(...) vlib_log(VLIB_LOG_LEVEL_DEBUG, __VA_ARGS__)
     139             : 
     140             : #define VLIB_REGISTER_LOG_CLASS(x,...) \
     141             : __VA_ARGS__ vlib_log_class_registration_t x; \
     142             : static void __clib_constructor                  \
     143             : __vlib_add_log_registration_##x (void)          \
     144             :   {                                             \
     145             :     vlib_log_main_t * lm = &log_main;               \
     146             :     x.next = lm->registrations;                      \
     147             :     x.class = ~0;                               \
     148             :     lm->registrations = &x;                      \
     149             :   }                                             \
     150             : __VA_ARGS__  vlib_log_class_registration_t x
     151             : 
     152             : static_always_inline vlib_log_class_data_t *
     153     2401440 : vlib_log_get_class_data (vlib_log_class_t ci)
     154             : {
     155     2401440 :   vlib_log_main_t *lm = &log_main;
     156     2401440 :   return vec_elt_at_index (lm->classes, (ci >> 16));
     157             : }
     158             : 
     159             : static_always_inline vlib_log_subclass_data_t *
     160     2119690 : vlib_log_get_subclass_data (vlib_log_class_t ci)
     161             : {
     162     2119690 :   vlib_log_class_data_t *c = vlib_log_get_class_data (ci);
     163     2119690 :   return vec_elt_at_index (c->subclasses, (ci & 0xffff));
     164             : }
     165             : 
     166             : static_always_inline int
     167             : vlib_log_is_enabled (vlib_log_level_t level, vlib_log_class_t class)
     168             : {
     169             :   vlib_log_subclass_data_t *sc = vlib_log_get_subclass_data (class);
     170             : 
     171             :   if (level <= sc->level && sc->level != VLIB_LOG_LEVEL_DISABLED)
     172             :     return 1;
     173             : 
     174             :   if (level <= sc->syslog_level && sc->syslog_level != VLIB_LOG_LEVEL_DISABLED)
     175             :     return 1;
     176             : 
     177             :   return 0;
     178             : }
     179             : 
     180             : #endif /* included_vlib_log_h */
     181             : 
     182             : /*
     183             :  * fd.io coding-style-patch-verification: ON
     184             :  *
     185             :  * Local Variables:
     186             :  * eval: (c-set-style "gnu")
     187             :  * End:
     188             :  */

Generated by: LCOV version 1.14