static FILE *default_log_stream;
/**
- * This global structure stores some informations about the message
+ * This global structure stores some information about the message
* that is currently being processed by one lcore
*/
struct log_cur_msg {
return 0;
}
+FILE *
+rte_log_get_stream(void)
+{
+ FILE *f = rte_logs.file;
+
+ if (f == NULL) {
+ /*
+ * Grab the current value of stderr here, rather than
+ * just initializing default_log_stream to stderr. This
+ * ensures that we will always use the current value
+ * of stderr, even if the application closes and
+ * reopens it.
+ */
+ return default_log_stream ? : stderr;
+ }
+ return f;
+}
+
/* Set global log level */
void
rte_log_set_global_level(uint32_t level)
}
/* Register an extended log type and try to pick its level from EAL options */
-int __rte_experimental
+int
rte_log_register_type_and_pick_level(const char *name, uint32_t level_def)
{
struct rte_eal_opt_loglevel *opt_ll;
};
/* Logging should be first initializer (before drivers and bus) */
-RTE_INIT_PRIO(rte_log_init, LOG);
-static void
-rte_log_init(void)
+RTE_INIT_PRIO(rte_log_init, LOG)
{
uint32_t i;
int
rte_vlog(uint32_t level, uint32_t logtype, const char *format, va_list ap)
{
+ FILE *f = rte_log_get_stream();
int ret;
- FILE *f = rte_logs.file;
- if (f == NULL) {
- f = default_log_stream;
- if (f == NULL) {
- /*
- * Grab the current value of stderr here, rather than
- * just initializing default_log_stream to stderr. This
- * ensures that we will always use the current value
- * of stderr, even if the application closes and
- * reopens it.
- */
- f = stderr;
- }
- }
if (level > rte_logs.level)
return 0;