X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Flib-logging-internal.h;h=ec8ce7f2e3b5074d4e9c4ea979f2d38ffc71aea8;hb=25f741168b45db9dd975136cfd3f66dbd9af39d0;hp=a692cd5591a3cf64a8500d6a09f8f202c300689d;hpb=beb0fb75663091c20765a8508162711ba828f456;p=babeltrace.git diff --git a/include/babeltrace/lib-logging-internal.h b/include/babeltrace/lib-logging-internal.h index a692cd55..ec8ce7f2 100644 --- a/include/babeltrace/lib-logging-internal.h +++ b/include/babeltrace/lib-logging-internal.h @@ -2,7 +2,7 @@ #define BABELTRACE_LIB_LOGGING_INTERNAL_H /* - * Copyright 2017 Philippe Proulx + * Copyright 2017-2018 Philippe Proulx * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,12 +24,170 @@ */ #include +#include + +#ifndef BT_LOG_TAG +# error Please define a tag with BT_LOG_TAG before including this file. +#endif #define BT_LOG_OUTPUT_LEVEL bt_lib_log_level #include -BT_HIDDEN +extern int bt_lib_log_level; +#define BT_LIB_LOG(_lvl, _fmt, ...) \ + do { \ + if (BT_LOG_ON(_lvl)) { \ + bt_lib_log(_BT_LOG_SRCLOC_FUNCTION, __FILE__, \ + __LINE__, _lvl, _BT_LOG_TAG, \ + (_fmt), ##__VA_ARGS__); \ + } \ + } while (0) + +/* + * The six macros below are logging statements which are specialized + * for the Babeltrace library. + * + * `_fmt` is a typical printf()-style format string, with the following + * limitations: + * + * * The `*` width specifier is not accepted. + * * The `*` precision specifier is not accepted. + * * The `j` and `t` length modifiers are not accepted. + * * The `n` format specifier is not accepted. + * * The format specifiers defined in are not accepted + * except for `PRId64`, `PRIu64`, `PRIx64`, `PRIX64`, `PRIo64`, and + * `PRIi64`. + * + * The Babeltrace extension conversion specifier is accepted. Its syntax + * is either `%!u` to format a UUID (`bt_uuid` type) or: + * + * 1. Introductory `%!` sequence. + * + * 2. Optional: `[` followed by a custom prefix for the printed fields + * of this specifier, followed by `]`. The standard form is to end + * this prefix with `-` so that, for example, with the prefix + * `prefix-`, the complete field name is `prefix-addr`. + * + * 3. Optional: `+` to print extended fields. This depends on the + * provided format specifier. + * + * 4. Format specifier (see below). + * + * The available format specifiers are: + * + * `F`: + * Trace IR field class. The parameter type is + * `struct bt_field_class *`. + * + * `f`: + * Trace IR field. The parameter type is `struct bt_field *`. + * + * `P`: + * Field path. The parameter type is `struct bt_field_path *`. + * + * `E`: + * Trace IR event class. The parameter type is + * `struct bt_event_class *`. + * + * `e`: + * Trace IR event. The parameter type is `struct bt_event *`. + * + * `S`: + * Trace IR stream class. The parameter type is + * `struct bt_stream_class *`. + * + * `s`: + * Trace IR stream. The parameter type is `struct bt_stream *`. + * + * `a`: + * Packet. The parameter type is `struct bt_packet *`. + * + * `T`: + * Trace IR trace class. The parameter type is `struct bt_trace_class *`. + * + * `t`: + * Trace IR trace. The parameter type is `struct bt_trace *`. + * + * `K`: + * Clock class. The parameter type is `struct bt_clock_class *`. + * + * `k`: + * Clock snapshot. The parameter type is `struct bt_clock_snapshot *`. + * + * `v`: + * Value. The parameter type is `struct bt_value *`. + * + * `n`: + * Message. The parameter type is `struct bt_message *`. + * + * `i`: + * Message iterator. The parameter type is + * `struct bt_message_iterator *`. + * + * `C`: + * Component class. The parameter type is + * `struct bt_component_class *`. + * + * `c`: + * Component. The parameter type is `struct bt_component *`. + * + * `p`: + * Port. The parameter type is `struct bt_port *`. + * + * `x`: + * Connection. The parameter type is `struct bt_connection *`. + * + * `g`: + * Graph. The parameter type is `struct bt_graph *`. + * + * `l`: + * Plugin. The parameter type is `const struct bt_plugin *`. + * + * `o`: + * Object pool. The parameter type is `struct bt_object_pool *`. + * + * `O`: + * Object. The parameter type is `struct bt_object *`. + * + * Conversion specifier examples: + * + * %!f + * %![my-event-]+e + * %!t + * %!+F + * + * The string `, ` is printed between individual fields, but not after + * the last one. Therefore you must put this separator in the format + * string between two conversion specifiers, e.g.: + * + * BT_LIB_LOGW("Message: count=%u, %!E, %!+K", count, event_class, + * clock_class); + * + * Example with a custom prefix: + * + * BT_LIB_LOGI("Some message: %![ec-a-]e, %![ec-b-]+e", ec_a, ec_b); + * + * It is safe to pass NULL as any Babeltrace object parameter: the + * macros only print its null address. + */ +#define BT_LIB_LOGF(_fmt, ...) BT_LIB_LOG(BT_LOG_FATAL, _fmt, ##__VA_ARGS__) +#define BT_LIB_LOGE(_fmt, ...) BT_LIB_LOG(BT_LOG_ERROR, _fmt, ##__VA_ARGS__) +#define BT_LIB_LOGW(_fmt, ...) BT_LIB_LOG(BT_LOG_WARN, _fmt, ##__VA_ARGS__) +#define BT_LIB_LOGI(_fmt, ...) BT_LIB_LOG(BT_LOG_INFO, _fmt, ##__VA_ARGS__) +#define BT_LIB_LOGD(_fmt, ...) BT_LIB_LOG(BT_LOG_DEBUG, _fmt, ##__VA_ARGS__) +#define BT_LIB_LOGV(_fmt, ...) BT_LIB_LOG(BT_LOG_VERBOSE, _fmt, ##__VA_ARGS__) + +/* + * Log statement, specialized for the Babeltrace library. + * + * Use one of the BT_LIB_LOGF*() macros above instead of calling this + * function directly. + */ +BT_HIDDEN +void bt_lib_log(const char *func, const char *file, unsigned line, + int lvl, const char *tag, const char *fmt, ...); + #endif /* BABELTRACE_LIB_LOGGING_INTERNAL_H */