`+BT_LIB_LOGF("format string", ...)+`::
Library fatal logging statement.
+`+BT_LIB_LOGW_APPEND_CAUSE("format string", ...)+`::
+ Library warning logging statement, and unconditional error cause
+ appending.
+
+`+BT_LIB_LOGE_APPEND_CAUSE("format string", ...)+`::
+ Library error logging statement, and unconditional error cause
+ appending.
+
+`+BT_LIB_LOGF_APPEND_CAUSE("format string", ...)+`::
+ Library fatal logging statement, and unconditional error cause
+ appending.
+
The macros above accept the typical `printf()` conversion specifiers
with the following limitations:
* SOFTWARE.
*/
-/*
- * This is just to satisfy the preprocessor check in "lib/logging.h":
- * this file does not log anything.
- */
-#define BT_LOG_TAG ""
+#define BT_LOG_TAG "LIB/LIB-LOGGING"
+#include "lib/logging.h"
#include <stdarg.h>
#include <stdio.h>
#include <babeltrace2/trace-ir/event-const.h>
#include <babeltrace2/trace-ir/packet-const.h>
#include <babeltrace2/trace-ir/stream-const.h>
+#include <babeltrace2/current-thread.h>
#include "logging.h"
#include "assert-pre.h"
va_end(args);
_bt_log_write_d(func, file, line, lvl, tag, "%s", lib_logging_buf);
}
+
+void bt_lib_maybe_log_and_append_cause(const char *func, const char *file,
+ unsigned line, int lvl, const char *tag,
+ const char *fmt, ...)
+{
+ va_list args;
+ bt_current_thread_error_append_cause_status status;
+
+ BT_ASSERT(fmt);
+ va_start(args, fmt);
+ bt_common_custom_vsnprintf(lib_logging_buf, LIB_LOGGING_BUF_SIZE, '!',
+ handle_conversion_specifier_bt, NULL, fmt, &args);
+ va_end(args);
+
+ /* Log conditionally, but always append the error cause */
+ if (BT_LOG_ON(lvl)) {
+ _bt_log_write_d(func, file, line, lvl, tag, "%s",
+ lib_logging_buf);
+ }
+
+ status = bt_current_thread_error_append_cause_from_unknown(
+ "Babeltrace library", file, line, "%s", lib_logging_buf);
+ if (status) {
+ /*
+ * Worst case: this error cause is not appended to the
+ * current thread's error.
+ *
+ * We can accept this as it's an almost impossible
+ * scenario and returning an error here would mean you
+ * need to check the return value of each
+ * BT_LIB_LOG*_APPEND_CAUSE() macro and that would be
+ * cumbersome.
+ */
+ BT_LOGE("Cannot append error cause to current thread's "
+ "error object: status=%s",
+ bt_common_func_status_string(status));
+ }
+}
/*
* Log statement, specialized for the Babeltrace library.
*
- * Use one of the BT_LIB_LOGF*() macros above instead of calling this
+ * This function does NOT check that logging is enabled for level `lvl`:
+ * you must check it manually with BT_LOG_ON().
+ *
+ * Use one of the BT_LIB_LOG*() macros above instead of calling this
* function directly.
*/
-
void bt_lib_log(const char *func, const char *file, unsigned line,
int lvl, const char *tag, const char *fmt, ...);
+#define BT_LIB_LOG_AND_APPEND(_lvl, _fmt, ...) \
+ do { \
+ bt_lib_maybe_log_and_append_cause( \
+ _BT_LOG_SRCLOC_FUNCTION, __FILE__, \
+ __LINE__, _lvl, _BT_LOG_TAG, \
+ (_fmt), ##__VA_ARGS__); \
+ } while (0)
+
+/* See `CONTRIBUTING.adoc` for usage */
+#define BT_LIB_LOGE_APPEND_CAUSE(_fmt, ...) \
+ BT_LIB_LOG_AND_APPEND(BT_LOG_ERROR, _fmt, ##__VA_ARGS__)
+#define BT_LIB_LOGW_APPEND_CAUSE(_fmt, ...) \
+ BT_LIB_LOG_AND_APPEND(BT_LOG_WARN, _fmt, ##__VA_ARGS__)
+
+/*
+ * Like bt_lib_log(), but also appends a cause to the current thread's
+ * error object.
+ *
+ * Note that, unlike bt_lib_log(), this function does check that logging
+ * is enabled for level `lvl` before logging. This is to ensure that,
+ * even though logging is disabled, the function still appends an error
+ * cause, as the error reporting system does not rely on logging.
+ *
+ * Use one of the BT_LIB_LOG*_APPEND_CAUSE() macros above instead of
+ * calling this function directly.
+ */
+void bt_lib_maybe_log_and_append_cause(const char *func, const char *file,
+ unsigned line, int lvl, const char *tag,
+ const char *fmt, ...);
+
#define BT_LIB_LOG_SUPPORTED
#endif /* BABELTRACE_LIB_LOGGING_INTERNAL_H */