#include <rte_config.h>
#include <rte_compat.h>
-struct rte_log_dynamic_type;
-
-/** The rte_log structure. */
-struct rte_logs {
- uint32_t type; /**< Bitfield with enabled logs. */
- uint32_t level; /**< Log level. */
- FILE *file; /**< Output file set by rte_openlog_stream, or NULL. */
- size_t dynamic_types_len;
- struct rte_log_dynamic_type *dynamic_types;
-};
-
-/** Global log information */
-extern struct rte_logs rte_logs;
-
/* SDK log type */
#define RTE_LOGTYPE_EAL 0 /**< Log related to eal. */
#define RTE_LOGTYPE_MALLOC 1 /**< Log related to malloc. */
int rte_openlog_stream(FILE *f);
/**
- * @warning
- * @b EXPERIMENTAL: this API may change without prior notice
- *
* Retrieve the stream used by the logging system (see rte_openlog_stream()
* to change it).
*
* @return
* Pointer to the stream.
*/
-__rte_experimental
FILE *rte_log_get_stream(void);
/**
bool rte_log_can_log(uint32_t logtype, uint32_t loglevel);
/**
- * Set the log level for a given type based on shell pattern.
+ * Set the log level for a given type based on globbing pattern.
*
* @param pattern
- * The match pattern identifying the log type.
+ * The globbing pattern identifying the log type.
* @param level
* The level to be set.
* @return
* to rte_openlog_stream().
*
* The level argument determines if the log should be displayed or
- * not, depending on the global rte_logs variable.
+ * not, depending on the loglevel settings.
*
* The preferred alternative is the RTE_LOG() because it adds the
* level and type in the logged string.
int rte_log(uint32_t level, uint32_t logtype, const char *format, ...)
#ifdef __GNUC__
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2))
- __attribute__((cold))
+ __rte_cold
#endif
#endif
__rte_format_printf(3, 4);
* to rte_openlog_stream().
*
* The level argument determines if the log should be displayed or
- * not, depending on the global rte_logs variable. A trailing
+ * not, depending on the loglevel settings. A trailing
* newline may be added if needed.
*
* The preferred alternative is the RTE_LOG() because it adds the
RTE_LOGTYPE_ ## t, # t ": " __VA_ARGS__) : \
0)
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Register a dynamic log type in constructor context with its name and level.
+ *
+ * It is a wrapper macro for declaring the logtype, register the log and
+ * sets it's level in the constructor context.
+ *
+ * @param type
+ * The log type identifier
+ * @param name
+ * Name for the log type to be registered
+ * @param level
+ * Log level. A value between EMERG (1) and DEBUG (8).
+ */
+#define RTE_LOG_REGISTER(type, name, level) \
+int type; \
+RTE_INIT(__##type) \
+{ \
+ type = rte_log_register_type_and_pick_level(RTE_STR(name), \
+ RTE_LOG_##level); \
+}
+
#ifdef __cplusplus
}
#endif