lib: generate trace events for log messages

LTTng supports tracef() and tracelog() macros, which work like printf,
and are used to ease transition between logging and tracing. Messages
printed using these macros end up as trace events. For our uses we are
not interested in dropping logging, but it is nice to get log messages
in trace output, so I've added a call to tracelog() in zlog that dumps
our zlog messages as trace events.

Signed-off-by: Quentin Young <qlyoung@nvidia.com>
This commit is contained in:
Quentin Young 2020-09-14 18:05:47 -04:00
parent abf96a87f3
commit 1bd1ebaa08
2 changed files with 30 additions and 0 deletions

View File

@ -107,6 +107,7 @@ THREAD_OPERATION_TRACEPOINT_INSTANCE(thread_call)
/* clang-format on */ /* clang-format on */
#include <lttng/tracepoint-event.h> #include <lttng/tracepoint-event.h>
#include <lttng/tracelog.h>
#else /* HAVE_LTTNG */ #else /* HAVE_LTTNG */

View File

@ -52,6 +52,7 @@
#include "printfrr.h" #include "printfrr.h"
#include "frrcu.h" #include "frrcu.h"
#include "zlog.h" #include "zlog.h"
#include "trace.h"
DEFINE_MTYPE_STATIC(LIB, LOG_MESSAGE, "log message") DEFINE_MTYPE_STATIC(LIB, LOG_MESSAGE, "log message")
DEFINE_MTYPE_STATIC(LIB, LOG_TLSBUF, "log thread-local buffer") DEFINE_MTYPE_STATIC(LIB, LOG_TLSBUF, "log thread-local buffer")
@ -450,6 +451,34 @@ void vzlog(int prio, const char *fmt, va_list ap)
{ {
struct zlog_tls *zlog_tls = zlog_tls_get(); struct zlog_tls *zlog_tls = zlog_tls_get();
#ifdef HAVE_LTTNG
va_list copy;
va_copy(copy, ap);
char *msg = vasprintfrr(MTYPE_LOG_MESSAGE, fmt, copy);
switch (prio) {
case LOG_ERR:
tracelog(TRACE_ERR, msg);
break;
case LOG_WARNING:
tracelog(TRACE_WARNING, msg);
break;
case LOG_DEBUG:
tracelog(TRACE_DEBUG, msg);
break;
case LOG_NOTICE:
tracelog(TRACE_DEBUG, msg);
break;
case LOG_INFO:
default:
tracelog(TRACE_INFO, msg);
break;
}
va_end(copy);
XFREE(MTYPE_LOG_MESSAGE, msg);
#endif
if (zlog_tls) if (zlog_tls)
vzlog_tls(zlog_tls, prio, fmt, ap); vzlog_tls(zlog_tls, prio, fmt, ap);
else else