dpdk/lib/eal/include/rte_log.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2010-2017 Intel Corporation
   3 */
   4
   5#ifndef _RTE_LOG_H_
   6#define _RTE_LOG_H_
   7
   8/**
   9 * @file
  10 *
  11 * RTE Logs API
  12 *
  13 * This file provides a log API to RTE applications.
  14 */
  15
  16#ifdef __cplusplus
  17extern "C" {
  18#endif
  19
  20#include <stdint.h>
  21#include <stdio.h>
  22#include <stdarg.h>
  23#include <stdbool.h>
  24#include <sys/queue.h>
  25
  26#include <rte_common.h>
  27#include <rte_config.h>
  28#include <rte_compat.h>
  29
  30/* SDK log type */
  31#define RTE_LOGTYPE_EAL        0 /**< Log related to eal. */
  32#define RTE_LOGTYPE_MALLOC     1 /**< Log related to malloc. */
  33#define RTE_LOGTYPE_RING       2 /**< Log related to ring. */
  34#define RTE_LOGTYPE_MEMPOOL    3 /**< Log related to mempool. */
  35#define RTE_LOGTYPE_TIMER      4 /**< Log related to timers. */
  36#define RTE_LOGTYPE_PMD        5 /**< Log related to poll mode driver. */
  37#define RTE_LOGTYPE_HASH       6 /**< Log related to hash table. */
  38#define RTE_LOGTYPE_LPM        7 /**< Log related to LPM. */
  39#define RTE_LOGTYPE_KNI        8 /**< Log related to KNI. */
  40#define RTE_LOGTYPE_ACL        9 /**< Log related to ACL. */
  41#define RTE_LOGTYPE_POWER     10 /**< Log related to power. */
  42#define RTE_LOGTYPE_METER     11 /**< Log related to QoS meter. */
  43#define RTE_LOGTYPE_SCHED     12 /**< Log related to QoS port scheduler. */
  44#define RTE_LOGTYPE_PORT      13 /**< Log related to port. */
  45#define RTE_LOGTYPE_TABLE     14 /**< Log related to table. */
  46#define RTE_LOGTYPE_PIPELINE  15 /**< Log related to pipeline. */
  47#define RTE_LOGTYPE_MBUF      16 /**< Log related to mbuf. */
  48#define RTE_LOGTYPE_CRYPTODEV 17 /**< Log related to cryptodev. */
  49#define RTE_LOGTYPE_EFD       18 /**< Log related to EFD. */
  50#define RTE_LOGTYPE_EVENTDEV  19 /**< Log related to eventdev. */
  51#define RTE_LOGTYPE_GSO       20 /**< Log related to GSO. */
  52
  53/* these log types can be used in an application */
  54#define RTE_LOGTYPE_USER1     24 /**< User-defined log type 1. */
  55#define RTE_LOGTYPE_USER2     25 /**< User-defined log type 2. */
  56#define RTE_LOGTYPE_USER3     26 /**< User-defined log type 3. */
  57#define RTE_LOGTYPE_USER4     27 /**< User-defined log type 4. */
  58#define RTE_LOGTYPE_USER5     28 /**< User-defined log type 5. */
  59#define RTE_LOGTYPE_USER6     29 /**< User-defined log type 6. */
  60#define RTE_LOGTYPE_USER7     30 /**< User-defined log type 7. */
  61#define RTE_LOGTYPE_USER8     31 /**< User-defined log type 8. */
  62
  63/** First identifier for extended logs */
  64#define RTE_LOGTYPE_FIRST_EXT_ID 32
  65
  66/* Can't use 0, as it gives compiler warnings */
  67#define RTE_LOG_EMERG    1U  /**< System is unusable.               */
  68#define RTE_LOG_ALERT    2U  /**< Action must be taken immediately. */
  69#define RTE_LOG_CRIT     3U  /**< Critical conditions.              */
  70#define RTE_LOG_ERR      4U  /**< Error conditions.                 */
  71#define RTE_LOG_WARNING  5U  /**< Warning conditions.               */
  72#define RTE_LOG_NOTICE   6U  /**< Normal but significant condition. */
  73#define RTE_LOG_INFO     7U  /**< Informational.                    */
  74#define RTE_LOG_DEBUG    8U  /**< Debug-level messages.             */
  75#define RTE_LOG_MAX RTE_LOG_DEBUG /**< Most detailed log level.     */
  76
  77/**
  78 * Change the stream that will be used by the logging system.
  79 *
  80 * This can be done at any time. The f argument represents the stream
  81 * to be used to send the logs. If f is NULL, the default output is
  82 * used (stderr).
  83 *
  84 * @param f
  85 *   Pointer to the stream.
  86 * @return
  87 *   - 0 on success.
  88 *   - Negative on error.
  89 */
  90int rte_openlog_stream(FILE *f);
  91
  92/**
  93 * Retrieve the stream used by the logging system (see rte_openlog_stream()
  94 * to change it).
  95 *
  96 * @return
  97 *   Pointer to the stream.
  98 */
  99FILE *rte_log_get_stream(void);
 100
 101/**
 102 * Set the global log level.
 103 *
 104 * After this call, logs with a level lower or equal than the level
 105 * passed as argument will be displayed.
 106 *
 107 * @param level
 108 *   Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
 109 */
 110void rte_log_set_global_level(uint32_t level);
 111
 112/**
 113 * Get the global log level.
 114 *
 115 * @return
 116 *   The current global log level.
 117 */
 118uint32_t rte_log_get_global_level(void);
 119
 120/**
 121 * Get the log level for a given type.
 122 *
 123 * @param logtype
 124 *   The log type identifier.
 125 * @return
 126 *   0 on success, a negative value if logtype is invalid.
 127 */
 128int rte_log_get_level(uint32_t logtype);
 129
 130/**
 131 * For a given `logtype`, check if a log with `loglevel` can be printed.
 132 *
 133 * @param logtype
 134 *   The log type identifier
 135 * @param loglevel
 136 *   Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
 137 * @return
 138 * Returns 'true' if log can be printed and 'false' if it can't.
 139 */
 140__rte_experimental
 141bool rte_log_can_log(uint32_t logtype, uint32_t loglevel);
 142
 143/**
 144 * Set the log level for a given type based on globbing pattern.
 145 *
 146 * @param pattern
 147 *   The globbing pattern identifying the log type.
 148 * @param level
 149 *   The level to be set.
 150 * @return
 151 *   0 on success, a negative value if level is invalid.
 152 */
 153int rte_log_set_level_pattern(const char *pattern, uint32_t level);
 154
 155/**
 156 * Set the log level for a given type based on regular expression.
 157 *
 158 * @param regex
 159 *   The regular expression identifying the log type.
 160 * @param level
 161 *   The level to be set.
 162 * @return
 163 *   0 on success, a negative value if level is invalid.
 164 */
 165int rte_log_set_level_regexp(const char *regex, uint32_t level);
 166
 167/**
 168 * Set the log level for a given type.
 169 *
 170 * @param logtype
 171 *   The log type identifier.
 172 * @param level
 173 *   The level to be set.
 174 * @return
 175 *   0 on success, a negative value if logtype or level is invalid.
 176 */
 177int rte_log_set_level(uint32_t logtype, uint32_t level);
 178
 179/**
 180 * Get the current loglevel for the message being processed.
 181 *
 182 * Before calling the user-defined stream for logging, the log
 183 * subsystem sets a per-lcore variable containing the loglevel and the
 184 * logtype of the message being processed. This information can be
 185 * accessed by the user-defined log output function through this
 186 * function.
 187 *
 188 * @return
 189 *   The loglevel of the message being processed.
 190 */
 191int rte_log_cur_msg_loglevel(void);
 192
 193/**
 194 * Get the current logtype for the message being processed.
 195 *
 196 * Before calling the user-defined stream for logging, the log
 197 * subsystem sets a per-lcore variable containing the loglevel and the
 198 * logtype of the message being processed. This information can be
 199 * accessed by the user-defined log output function through this
 200 * function.
 201 *
 202 * @return
 203 *   The logtype of the message being processed.
 204 */
 205int rte_log_cur_msg_logtype(void);
 206
 207/**
 208 * Register a dynamic log type
 209 *
 210 * If a log is already registered with the same type, the returned value
 211 * is the same than the previous one.
 212 *
 213 * @param name
 214 *   The string identifying the log type.
 215 * @return
 216 *   - >0: success, the returned value is the log type identifier.
 217 *   - (-ENOMEM): cannot allocate memory.
 218 */
 219int rte_log_register(const char *name);
 220
 221/**
 222 * @warning
 223 * @b EXPERIMENTAL: this API may change without prior notice
 224 *
 225 * Register a dynamic log type and try to pick its level from EAL options
 226 *
 227 * rte_log_register() is called inside. If successful, the function tries
 228 * to search for matching regexp in the list of EAL log level options and
 229 * pick the level from the last matching entry. If nothing can be applied
 230 * from the list, the level will be set to the user-defined default value.
 231 *
 232 * @param name
 233 *    Name for the log type to be registered
 234 * @param level_def
 235 *    Fallback level to be set if the global list has no matching options
 236 * @return
 237 *    - >=0: the newly registered log type
 238 *    - <0: rte_log_register() error value
 239 */
 240__rte_experimental
 241int rte_log_register_type_and_pick_level(const char *name, uint32_t level_def);
 242
 243/**
 244 * @warning
 245 * @b EXPERIMENTAL: this API may change without prior notice
 246 *
 247 * Dump name of each logtype, one per line.
 248 *
 249 * @param out
 250 *   Stream where the list is sent.
 251 * @param prefix
 252 *   String preceding each logtype in the output.
 253 */
 254__rte_experimental
 255void rte_log_list_types(FILE *out, const char *prefix);
 256
 257/**
 258 * Dump log information.
 259 *
 260 * Dump the global level and the registered log types.
 261 *
 262 * @param f
 263 *   The output stream where the dump should be sent.
 264 */
 265void rte_log_dump(FILE *f);
 266
 267/**
 268 * Generates a log message.
 269 *
 270 * The message will be sent in the stream defined by the previous call
 271 * to rte_openlog_stream().
 272 *
 273 * The level argument determines if the log should be displayed or
 274 * not, depending on the loglevel settings.
 275 *
 276 * The preferred alternative is the RTE_LOG() because it adds the
 277 * level and type in the logged string.
 278 *
 279 * @param level
 280 *   Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
 281 * @param logtype
 282 *   The log type, for example, RTE_LOGTYPE_EAL.
 283 * @param format
 284 *   The format string, as in printf(3), followed by the variable arguments
 285 *   required by the format.
 286 * @return
 287 *   - 0: Success.
 288 *   - Negative on error.
 289 */
 290int rte_log(uint32_t level, uint32_t logtype, const char *format, ...)
 291#ifdef __GNUC__
 292#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2))
 293        __rte_cold
 294#endif
 295#endif
 296        __rte_format_printf(3, 4);
 297
 298/**
 299 * Generates a log message.
 300 *
 301 * The message will be sent in the stream defined by the previous call
 302 * to rte_openlog_stream().
 303 *
 304 * The level argument determines if the log should be displayed or
 305 * not, depending on the loglevel settings. A trailing
 306 * newline may be added if needed.
 307 *
 308 * The preferred alternative is the RTE_LOG() because it adds the
 309 * level and type in the logged string.
 310 *
 311 * @param level
 312 *   Log level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8).
 313 * @param logtype
 314 *   The log type, for example, RTE_LOGTYPE_EAL.
 315 * @param format
 316 *   The format string, as in printf(3), followed by the variable arguments
 317 *   required by the format.
 318 * @param ap
 319 *   The va_list of the variable arguments required by the format.
 320 * @return
 321 *   - 0: Success.
 322 *   - Negative on error.
 323 */
 324int rte_vlog(uint32_t level, uint32_t logtype, const char *format, va_list ap)
 325        __rte_format_printf(3, 0);
 326
 327/**
 328 * Generates a log message.
 329 *
 330 * The RTE_LOG() is a helper that prefixes the string with the log level
 331 * and type, and call rte_log().
 332 *
 333 * @param l
 334 *   Log level. A value between EMERG (1) and DEBUG (8). The short name is
 335 *   expanded by the macro, so it cannot be an integer value.
 336 * @param t
 337 *   The log type, for example, EAL. The short name is expanded by the
 338 *   macro, so it cannot be an integer value.
 339 * @param ...
 340 *   The fmt string, as in printf(3), followed by the variable arguments
 341 *   required by the format.
 342 * @return
 343 *   - 0: Success.
 344 *   - Negative on error.
 345 */
 346#define RTE_LOG(l, t, ...)                                      \
 347         rte_log(RTE_LOG_ ## l,                                 \
 348                 RTE_LOGTYPE_ ## t, # t ": " __VA_ARGS__)
 349
 350/**
 351 * Generates a log message for data path.
 352 *
 353 * Similar to RTE_LOG(), except that it is removed at compilation time
 354 * if the RTE_LOG_DP_LEVEL configuration option is lower than the log
 355 * level argument.
 356 *
 357 * @param l
 358 *   Log level. A value between EMERG (1) and DEBUG (8). The short name is
 359 *   expanded by the macro, so it cannot be an integer value.
 360 * @param t
 361 *   The log type, for example, EAL. The short name is expanded by the
 362 *   macro, so it cannot be an integer value.
 363 * @param ...
 364 *   The fmt string, as in printf(3), followed by the variable arguments
 365 *   required by the format.
 366 * @return
 367 *   - 0: Success.
 368 *   - Negative on error.
 369 */
 370#define RTE_LOG_DP(l, t, ...)                                   \
 371        (void)((RTE_LOG_ ## l <= RTE_LOG_DP_LEVEL) ?            \
 372         rte_log(RTE_LOG_ ## l,                                 \
 373                 RTE_LOGTYPE_ ## t, # t ": " __VA_ARGS__) :     \
 374         0)
 375
 376#define RTE_LOG_REGISTER_IMPL(type, name, level)                            \
 377int type;                                                                   \
 378RTE_INIT(__##type)                                                          \
 379{                                                                           \
 380        type = rte_log_register_type_and_pick_level(name, RTE_LOG_##level); \
 381        if (type < 0)                                                       \
 382                type = RTE_LOGTYPE_EAL;                                     \
 383}
 384
 385/**
 386 * @warning
 387 * @b EXPERIMENTAL: this API may change without prior notice
 388 *
 389 * Register a dynamic log type in constructor context with its name and level.
 390 *
 391 * It is a wrapper macro for declaring the logtype, register the log and
 392 * sets it's level in the constructor context.
 393 *
 394 * @param type
 395 *   The log type identifier
 396 * @param name
 397 *    Name for the log type to be registered
 398 * @param level
 399 *   Log level. A value between EMERG (1) and DEBUG (8).
 400 */
 401#define RTE_LOG_REGISTER(type, name, level) \
 402        RTE_LOG_REGISTER_IMPL(type, RTE_STR(name), level)
 403
 404/**
 405 * @warning
 406 * @b EXPERIMENTAL: this API may change without prior notice
 407 *
 408 * This is an equivalent to RTE_LOG_REGISTER, but relying on the build system
 409 * to select the right format for the logtype.
 410 */
 411#define RTE_LOG_REGISTER_DEFAULT(type, level) \
 412        RTE_LOG_REGISTER_IMPL(type, RTE_STR(RTE_LOG_DEFAULT_LOGTYPE), level)
 413
 414/**
 415 * @warning
 416 * @b EXPERIMENTAL: this API may change without prior notice
 417 *
 418 * This is an equivalent to RTE_LOG_REGISTER, but relying on the build system
 419 * to select the right prefix for the logtype.
 420 */
 421#define RTE_LOG_REGISTER_SUFFIX(type, suffix, level)                          \
 422        RTE_LOG_REGISTER_IMPL(type,                                           \
 423                 RTE_STR(RTE_LOG_DEFAULT_LOGTYPE) "." RTE_STR(suffix), level)
 424
 425#ifdef __cplusplus
 426}
 427#endif
 428
 429#endif /* _RTE_LOG_H_ */
 430