X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=include%2Fbabeltrace%2Flogging-internal.h;h=0816103047de20d935c6962a315472bf2f2a890d;hb=0550901200156da07befb55b3aa23e0180d959e2;hp=1480a0829c12335f485d2b5e4db186bd4947fa60;hpb=40c958cfbacf5f2deb768ce216aa2395dd888462;p=babeltrace.git diff --git a/include/babeltrace/logging-internal.h b/include/babeltrace/logging-internal.h index 1480a082..08161030 100644 --- a/include/babeltrace/logging-internal.h +++ b/include/babeltrace/logging-internal.h @@ -9,7 +9,10 @@ #ifndef BABELTRACE_LOGGING_INTERNAL_H #define BABELTRACE_LOGGING_INTERNAL_H +#include +#include #include +#include /* To detect incompatible changes you can define BT_LOG_VERSION_REQUIRED to be * the current value of BT_LOG_VERSION before including this file (or via @@ -153,7 +156,11 @@ #if defined(BT_LOG_OUTPUT_LEVEL) #define _BT_LOG_OUTPUT_LEVEL BT_LOG_OUTPUT_LEVEL #else - #define _BT_LOG_OUTPUT_LEVEL _bt_log_global_output_lvl + /* + * We disallow this to make sure Babeltrace modules always + * have their own local log level. + */ + #error No log level symbol specified: please define BT_LOG_OUTPUT_LEVEL before including this header. #endif /* "Tag" is a compound string that could be associated with a log message. It @@ -434,9 +441,16 @@ #endif #if defined(__printflike) - #define _BT_LOG_PRINTFLIKE(a, b) __printflike(a, b) + #define _BT_LOG_PRINTFLIKE(str_index, first_to_check) \ + __printflike(str_index, first_to_check) +#elif defined(__MINGW_PRINTF_FORMAT) + #define _BT_LOG_PRINTFLIKE(str_index, first_to_check) \ + __attribute__((format(__MINGW_PRINTF_FORMAT, str_index, first_to_check))) +#elif defined(__GNUC__) + #define _BT_LOG_PRINTFLIKE(str_index, first_to_check) \ + __attribute__((format(__printf__, str_index, first_to_check))) #else - #define _BT_LOG_PRINTFLIKE(a, b) + #define _BT_LOG_PRINTFLIKE(str_index, first_to_check) #endif #if (defined(_WIN32) || defined(_WIN64)) && !defined(__GNUC__) @@ -721,6 +735,14 @@ void _bt_log_write_mem_aux( * - BT_LOGE("format string", args, ...) * - BT_LOGF("format string", args, ...) * + * Message and error string (errno) logging macros: + * - BT_LOGV_ERRNO("initial message", "format string", args, ...) + * - BT_LOGD_ERRNO("initial message", "format string", args, ...) + * - BT_LOGI_ERRNO("initial message", "format string", args, ...) + * - BT_LOGW_ERRNO("initial message", "format string", args, ...) + * - BT_LOGE_ERRNO("initial message", "format string", args, ...) + * - BT_LOGF_ERRNO("initial message", "format string", args, ...) + * * Memory logging macros: * - BT_LOGV_MEM(data_ptr, data_sz, "format string", args, ...) * - BT_LOGD_MEM(data_ptr, data_sz, "format string", args, ...) @@ -815,6 +837,13 @@ void _bt_log_write_mem_aux( } _BT_LOG_ONCE #endif +#define BT_LOG_WRITE_ERRNO(lvl, tag, _msg, _fmt, args...) \ + do { \ + const char *error_str; \ + error_str = g_strerror(errno); \ + BT_LOG_WRITE(lvl, tag, _msg ": %s" _fmt, error_str, ## args); \ + } _BT_LOG_ONCE + static _BT_LOG_INLINE void _bt_log_unused(const int dummy, ...) {(void)dummy;} #define _BT_LOG_UNUSED(...) \ @@ -823,6 +852,8 @@ static _BT_LOG_INLINE void _bt_log_unused(const int dummy, ...) {(void)dummy;} #if BT_LOG_ENABLED_VERBOSE #define BT_LOGV(...) \ BT_LOG_WRITE(BT_LOG_VERBOSE, _BT_LOG_TAG, __VA_ARGS__) + #define BT_LOGV_ERRNO(...) \ + BT_LOG_WRITE_ERRNO(BT_LOG_VERBOSE, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGV_AUX(log, ...) \ BT_LOG_WRITE_AUX(log, BT_LOG_VERBOSE, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGV_MEM(d, d_sz, ...) \ @@ -839,6 +870,8 @@ static _BT_LOG_INLINE void _bt_log_unused(const int dummy, ...) {(void)dummy;} #if BT_LOG_ENABLED_DEBUG #define BT_LOGD(...) \ BT_LOG_WRITE(BT_LOG_DEBUG, _BT_LOG_TAG, __VA_ARGS__) + #define BT_LOGD_ERRNO(...) \ + BT_LOG_WRITE_ERRNO(BT_LOG_DEBUG, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGD_AUX(log, ...) \ BT_LOG_WRITE_AUX(log, BT_LOG_DEBUG, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGD_MEM(d, d_sz, ...) \ @@ -855,6 +888,8 @@ static _BT_LOG_INLINE void _bt_log_unused(const int dummy, ...) {(void)dummy;} #if BT_LOG_ENABLED_INFO #define BT_LOGI(...) \ BT_LOG_WRITE(BT_LOG_INFO, _BT_LOG_TAG, __VA_ARGS__) + #define BT_LOGI_ERRNO(...) \ + BT_LOG_WRITE_ERRNO(BT_LOG_INFO, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGI_AUX(log, ...) \ BT_LOG_WRITE_AUX(log, BT_LOG_INFO, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGI_MEM(d, d_sz, ...) \ @@ -871,6 +906,8 @@ static _BT_LOG_INLINE void _bt_log_unused(const int dummy, ...) {(void)dummy;} #if BT_LOG_ENABLED_WARN #define BT_LOGW(...) \ BT_LOG_WRITE(BT_LOG_WARN, _BT_LOG_TAG, __VA_ARGS__) + #define BT_LOGW_ERRNO(...) \ + BT_LOG_WRITE_ERRNO(BT_LOG_WARN, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGW_AUX(log, ...) \ BT_LOG_WRITE_AUX(log, BT_LOG_WARN, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGW_MEM(d, d_sz, ...) \ @@ -887,6 +924,8 @@ static _BT_LOG_INLINE void _bt_log_unused(const int dummy, ...) {(void)dummy;} #if BT_LOG_ENABLED_ERROR #define BT_LOGE(...) \ BT_LOG_WRITE(BT_LOG_ERROR, _BT_LOG_TAG, __VA_ARGS__) + #define BT_LOGE_ERRNO(...) \ + BT_LOG_WRITE_ERRNO(BT_LOG_ERROR, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGE_AUX(log, ...) \ BT_LOG_WRITE_AUX(log, BT_LOG_ERROR, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGE_MEM(d, d_sz, ...) \ @@ -903,6 +942,8 @@ static _BT_LOG_INLINE void _bt_log_unused(const int dummy, ...) {(void)dummy;} #if BT_LOG_ENABLED_FATAL #define BT_LOGF(...) \ BT_LOG_WRITE(BT_LOG_FATAL, _BT_LOG_TAG, __VA_ARGS__) + #define BT_LOGF_ERRNO(...) \ + BT_LOG_WRITE_ERRNO(BT_LOG_FATAL, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGF_AUX(log, ...) \ BT_LOG_WRITE_AUX(log, BT_LOG_FATAL, _BT_LOG_TAG, __VA_ARGS__) #define BT_LOGF_MEM(d, d_sz, ...) \ @@ -940,6 +981,8 @@ extern "C" { * bt_log_set_output_v(BT_LOG_OUT_STDERR); */ enum { BT_LOG_OUT_STDERR_MASK = BT_LOG_PUT_STD }; + +BT_HIDDEN void bt_log_out_stderr_callback(const bt_log_message *const msg, void *arg); #define BT_LOG_OUT_STDERR BT_LOG_OUT_STDERR_MASK, 0, bt_log_out_stderr_callback @@ -953,8 +996,59 @@ void bt_log_out_stderr_callback(const bt_log_message *const msg, void *arg); */ #define BT_LOG_STDERR (&_bt_log_stderr_spec) +static inline +int bt_log_get_level_from_env(const char *var) +{ + const char *varval = getenv(var); + int level = BT_LOG_NONE; + + if (!varval) { + goto end; + } + + if (strcmp(varval, "VERBOSE") == 0 || + strcmp(varval, "V") == 0) { + level = BT_LOG_VERBOSE; + } else if (strcmp(varval, "DEBUG") == 0 || + strcmp(varval, "D") == 0) { + level = BT_LOG_DEBUG; + } else if (strcmp(varval, "INFO") == 0 || + strcmp(varval, "I") == 0) { + level = BT_LOG_INFO; + } else if (strcmp(varval, "WARN") == 0 || + strcmp(varval, "WARNING") == 0 || + strcmp(varval, "W") == 0) { + level = BT_LOG_WARN; + } else if (strcmp(varval, "ERROR") == 0 || + strcmp(varval, "E") == 0) { + level = BT_LOG_ERROR; + } else if (strcmp(varval, "FATAL") == 0 || + strcmp(varval, "F") == 0) { + level = BT_LOG_FATAL; + } else if (strcmp(varval, "NONE") == 0 || + strcmp(varval, "N") == 0) { + level = BT_LOG_NONE; + } else { + /* Should we warn here? How? */ + } + +end: + return level; +} + +#define BT_LOG_LEVEL_EXTERN_SYMBOL(_level_sym) \ + extern int _level_sym + +#define BT_LOG_INIT_LOG_LEVEL(_level_sym, _env_var) \ + BT_HIDDEN int _level_sym = BT_LOG_NONE; \ + static \ + void __attribute__((constructor)) _bt_log_level_ctor(void) \ + { \ + _level_sym = bt_log_get_level_from_env(_env_var); \ + } + #ifdef __cplusplus } #endif -#endif +#endif /* BABELTRACE_LOGGING_INTERNAL_H */