#include "cpp-common/bt2/self-message-iterator.hpp"
#include "cpp-common/bt2s/optional.hpp"
#include "cpp-common/vendor/fmt/core.h"
+#include "cpp-common/vendor/wise-enum/wise_enum.h"
#include "logging/log-api.h"
+#include "aliases.hpp"
+#include "text-loc-str.hpp"
+
namespace bt2c {
/*
* A logger contains an actor (self component class, self component,
* self message iterator, or simple module name), a current logging
- * level, and a logging tag.
+ * level, a logging tag, and a current text location string format.
+ *
+ * It offers:
+ *
+ * log():
+ * Logs a normal message.
+ *
+ * logMem():
+ * Logs a message with a hexadecimal view of memory bytes.
+ *
+ * logErrno():
+ * Logs a message with the error message corresponding to the
+ * current value of `errno`.
+ *
+ * logTextLoc():
+ * Logs a message with a text location using the current text
+ * location string format.
*
- * It offers the logNoThrow(), logMemNoThrow(), logErrnoNoThrow(),
- * logErrorAndThrow(), logErrorAndRethrow(), logErrorErrnoAndThrow(),
- * and logErrorErrnoAndRethrow() method templates to log using a given
- * level, optionally append a cause to the error of the current thread
- * using the correct actor, and optionally throw or rethrow.
+ * The initial text location string format is
+ * `TextLocStrFmt::LineColNosAndOffset`.
*
- * The methods above expect a format string and zero or more arguments
- * to be formatted with fmt::format().
+ * Change the default text location string format with
+ * textLocStrFmt().
+ *
+ * Some methods have their logError*AndThrow() and logError*AndThrow()
+ * equivalents to append a cause to the error of the current thread
+ * using the correct actor, and then throw or rethrow.
+ *
+ * The logging methods above expect a format string and zero or more
+ * arguments to be formatted with fmt::format().
+ *
+ * Use the BT_CPPLOG*() macros to use `__FILE__`, `__func__`, `__LINE__`
+ * as the file name, function name, and line number.
*/
class Logger final
{
public:
+ /* clang-format off */
+
/* Available log levels */
- enum class Level
- {
- TRACE = BT_LOG_TRACE,
- DEBUG = BT_LOG_DEBUG,
- INFO = BT_LOG_INFO,
- WARNING = BT_LOG_WARNING,
- ERROR = BT_LOG_ERROR,
- FATAL = BT_LOG_FATAL,
- NONE = BT_LOG_NONE,
- };
+ WISE_ENUM_CLASS_MEMBER(Level,
+ (Trace, BT_LOG_TRACE),
+ (Debug, BT_LOG_DEBUG),
+ (Info, BT_LOG_INFO),
+ (Warning, BT_LOG_WARNING),
+ (Error, BT_LOG_ERROR),
+ (Fatal, BT_LOG_FATAL),
+ (None, BT_LOG_NONE)
+ )
+
+ /* clang-format on */
/*
* Builds a logger from the self component class `selfCompCls` using
* `tag`.
*/
explicit Logger(const bt2::SelfComponent selfComp, std::string tag) noexcept :
- _mSelfComp {selfComp}, _mLevel {static_cast<Level>(selfComp.loggingLevel())}, _mTag {
- std::move(
- tag)}
+ _mSelfComp {selfComp}, _mLevel {static_cast<Level>(selfComp.loggingLevel())},
+ _mTag {std::move(tag)}
{
}
*/
explicit Logger(const Logger& other, std::string newTag) :
_mSelfCompCls {other._mSelfCompCls}, _mSelfComp {other._mSelfComp},
- _mSelfMsgIter {other._mSelfMsgIter},
- _mModuleName {other._mModuleName}, _mLevel {other._mLevel}, _mTag {std::move(newTag)}
+ _mSelfMsgIter {other._mSelfMsgIter}, _mModuleName {other._mModuleName},
+ _mLevel {other._mLevel}, _mTag {std::move(newTag)}, _mTextLocStrFmt {other._mTextLocStrFmt}
{
}
return _mLevel;
}
- /*
- * Current logging level converted to a `bt_log_level` value.
- *
- * For legacy code.
- */
- bt_log_level cLevel() const noexcept
- {
- return static_cast<bt_log_level>(_mLevel);
- }
-
/*
* Whether or not this logger would log at the level `level`.
*/
*/
bool wouldLogT() const noexcept
{
- return this->wouldLog(Level::TRACE);
+ return this->wouldLog(Level::Trace);
}
/*
*/
bool wouldLogD() const noexcept
{
- return this->wouldLog(Level::DEBUG);
+ return this->wouldLog(Level::Debug);
}
/*
*/
bool wouldLogI() const noexcept
{
- return this->wouldLog(Level::INFO);
+ return this->wouldLog(Level::Info);
}
/*
*/
bool wouldLogW() const noexcept
{
- return this->wouldLog(Level::WARNING);
+ return this->wouldLog(Level::Warning);
}
/*
*/
bool wouldLogE() const noexcept
{
- return this->wouldLog(Level::ERROR);
+ return this->wouldLog(Level::Error);
}
/*
*/
bool wouldLogF() const noexcept
{
- return this->wouldLog(Level::FATAL);
+ return this->wouldLog(Level::Fatal);
}
/*
return _mModuleName;
}
+ /*
+ * Sets the text location string format to be used by logTextLoc(),
+ * logErrorTextLocAndThrow(), and logErrorTextLocAndRethrow() to
+ * `fmt`.
+ */
+ void textLocStrFmt(const TextLocStrFmt fmt) noexcept
+ {
+ _mTextLocStrFmt = fmt;
+ }
+
+ /*
+ * Text location string format used by logTextLoc(),
+ * logErrorTextLocAndThrow(), and logErrorTextLocAndRethrow().
+ */
+ TextLocStrFmt textLocStrFmt() const noexcept
+ {
+ return _mTextLocStrFmt;
+ }
+
+ void appendCauseStr(const char * const fileName, const int lineNo, const char * const initMsg,
+ const char * const msg) const noexcept
+ {
+ if (_mSelfMsgIter) {
+ bt_current_thread_error_append_cause_from_message_iterator(
+ _mSelfMsgIter->libObjPtr(), fileName, lineNo, "%s%s", initMsg, msg);
+ } else if (_mSelfComp) {
+ bt_current_thread_error_append_cause_from_component(_mSelfComp->libObjPtr(), fileName,
+ lineNo, "%s%s", initMsg, msg);
+ } else if (_mSelfCompCls) {
+ bt_current_thread_error_append_cause_from_component_class(
+ _mSelfCompCls->libObjPtr(), fileName, lineNo, "%s%s", initMsg, msg);
+ } else {
+ BT_ASSERT(_mModuleName);
+ bt_current_thread_error_append_cause_from_unknown(_mModuleName->data(), fileName,
+ lineNo, "%s%s", initMsg, msg);
+ }
+ }
+
private:
struct _StdLogWriter final
{
static void write(const char * const fileName, const char * const funcName,
const unsigned lineNo, const Level level, const char * const tag,
- const void *, unsigned int, const char * const initMsg,
- const char * const msg) noexcept
+ ConstBytes, const char * const initMsg, const char * const msg) noexcept
{
BT_ASSERT_DBG(initMsg && std::strcmp(initMsg, "") == 0);
bt_log_write(fileName, funcName, lineNo, static_cast<bt_log_level>(level), tag, msg);
* the error of the current thread using the same message.
*/
template <Level LevelV, bool AppendCauseV, typename... ArgTs>
- void logNoThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const fmt, ArgTs&&...args) const
- {
- this->_logNoThrow<_StdLogWriter, LevelV, AppendCauseV>(
- fileName, funcName, lineNo, nullptr, 0, "", fmt, std::forward<ArgTs>(args)...);
- }
-
- /*
- * Logs `msg` using the level `LevelV`.
- *
- * If `AppendCauseV` is true, this method also appends a cause to
- * the error of the current thread using the same message.
- */
- template <Level LevelV, bool AppendCauseV>
- void logStrNoThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const msg) const
+ void log(const char * const fileName, const char * const funcName, const unsigned int lineNo,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
- this->_logStrNoThrow<_StdLogWriter, LevelV, AppendCauseV>(fileName, funcName, lineNo,
- nullptr, 0, "", msg);
+ this->_log<_StdLogWriter, LevelV, AppendCauseV>(
+ fileName, funcName, lineNo, {}, "", std::move(fmt), std::forward<ArgTs>(args)...);
}
/*
- * Like logAndNoThrow() with the `Level::ERROR` level, but also
- * throws a default-constructed instance of `ExcT`.
+ * Like log() with the `Level::Error` level, but also throws a
+ * default-constructed instance of `ExcT`.
*/
template <bool AppendCauseV, typename ExcT, typename... ArgTs>
[[noreturn]] void logErrorAndThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const fmt,
+ const unsigned int lineNo, fmt::format_string<ArgTs...> fmt,
ArgTs&&...args) const
{
- this->logNoThrow<Level::ERROR, AppendCauseV>(fileName, funcName, lineNo, fmt,
- std::forward<ArgTs>(args)...);
- throw ExcT {};
- }
-
- /*
- * Like logStrAndNoThrow() with the `Level::ERROR` level, but also
- * throws a default-constructed instance of `ExcT`.
- */
- template <bool AppendCauseV, typename ExcT>
- [[noreturn]] void logErrorStrAndThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const msg) const
- {
- this->logStrNoThrow<Level::ERROR, AppendCauseV>(fileName, funcName, lineNo, msg);
+ this->log<Level::Error, AppendCauseV>(fileName, funcName, lineNo, std::move(fmt),
+ std::forward<ArgTs>(args)...);
throw ExcT {};
}
/*
- * Like logAndNoThrow() with the `Level::ERROR` level, but also
- * rethrows.
+ * Like log() with the `Level::Error` level, but also rethrows.
*/
template <bool AppendCauseV, typename... ArgTs>
[[noreturn]] void logErrorAndRethrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const fmt,
- ArgTs&&...args) const
+ const unsigned int lineNo,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
- this->logNoThrow<Level::ERROR, AppendCauseV>(fileName, funcName, lineNo, fmt,
- std::forward<ArgTs>(args)...);
- throw;
- }
-
- /*
- * Like logStrAndNoThrow() with the `Level::ERROR` level, but also
- * rethrows.
- */
- template <bool AppendCauseV>
- [[noreturn]] void logErrorStrAndRethrow(const char * const fileName,
- const char * const funcName, const unsigned int lineNo,
- const char * const msg) const
- {
- this->logStrNoThrow<Level::ERROR, AppendCauseV>(fileName, funcName, lineNo, msg);
+ this->log<Level::Error, AppendCauseV>(fileName, funcName, lineNo, std::move(fmt),
+ std::forward<ArgTs>(args)...);
throw;
}
{
static void write(const char * const fileName, const char * const funcName,
const unsigned lineNo, const Level level, const char * const tag,
- const void *, unsigned int, const char * const initMsg,
- const char * const msg) noexcept
+ ConstBytes, const char * const initMsg, const char * const msg) noexcept
{
bt_log_write_printf(funcName, fileName, lineNo, static_cast<bt_log_level>(level), tag,
"%s%s", initMsg, msg);
* the error of the current thread using the same message.
*/
template <Level LevelV, bool AppendCauseV, typename... ArgTs>
- void logErrnoNoThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const initMsg,
- const char * const fmt, ArgTs&&...args) const
+ void logErrno(const char * const fileName, const char * const funcName,
+ const unsigned int lineNo, const char * const initMsg,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
- this->_logNoThrow<_InitMsgLogWriter, LevelV, AppendCauseV>(
- fileName, funcName, lineNo, nullptr, 0, this->_errnoIntroStr(initMsg).c_str(), fmt,
+ this->_log<_InitMsgLogWriter, LevelV, AppendCauseV>(
+ fileName, funcName, lineNo, {}, this->_errnoIntroStr(initMsg).c_str(), std::move(fmt),
std::forward<ArgTs>(args)...);
}
/*
- * Logs the message of `errno` using the level `LevelV`.
- *
- * The log message starts with `initMsg`, is followed with the
- * message for `errno`, and then with `msg`.
- *
- * If `AppendCauseV` is true, this method also appends a cause to
- * the error of the current thread using the same message.
- */
- template <Level LevelV, bool AppendCauseV>
- void logErrnoStrNoThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const initMsg,
- const char * const msg) const
- {
- this->_logStrNoThrow<_InitMsgLogWriter, LevelV, AppendCauseV>(
- fileName, funcName, lineNo, nullptr, 0, this->_errnoIntroStr(initMsg).c_str(), msg);
- }
-
- /*
- * Like logErrnoNoThrow() with the `Level::ERROR` level, but also
- * throws a default-constructed instance of `ExcT`.
+ * Like logErrno() with the `Level::Error` level, but also throws a
+ * default-constructed instance of `ExcT`.
*/
template <bool AppendCauseV, typename ExcT, typename... ArgTs>
[[noreturn]] void logErrorErrnoAndThrow(const char * const fileName,
const char * const funcName, const unsigned int lineNo,
- const char * const initMsg, const char * const fmt,
- ArgTs&&...args) const
+ const char * const initMsg,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
- this->logErrnoNoThrow<Level::ERROR, AppendCauseV>(fileName, funcName, lineNo, initMsg, fmt,
- std::forward<ArgTs>(args)...);
+ this->logErrno<Level::Error, AppendCauseV>(fileName, funcName, lineNo, initMsg,
+ std::move(fmt), std::forward<ArgTs>(args)...);
throw ExcT {};
}
/*
- * Like logErrnoStrNoThrow() with the `Level::ERROR` level, but also
- * throws a default-constructed instance of `ExcT`.
+ * Like logErrno() with the `Level::Error` level, but also rethrows.
*/
- template <bool AppendCauseV, typename ExcT>
+ template <bool AppendCauseV, typename... ArgTs>
[[noreturn]] void
- logErrorErrnoStrAndThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const initMsg,
- const char * const msg) const
+ logErrorErrnoAndRethrow(const char * const fileName, const char * const funcName,
+ const unsigned int lineNo, const char * const initMsg,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
- this->logErrnoStrNoThrow<Level::ERROR, AppendCauseV>(fileName, funcName, lineNo, initMsg,
- msg);
- throw ExcT {};
+ this->logErrno<Level::Error, AppendCauseV>(fileName, funcName, lineNo, initMsg,
+ std::move(fmt), std::forward<ArgTs>(args)...);
+ throw;
}
/*
- * Like logErrnoNoThrow() with the `Level::ERROR` level, but also
- * rethrows.
+ * Logs the text location of `textLoc` followed with a message using
+ * the level `LevelV`.
+ *
+ * The log message starts with the formatted text location and is
+ * followed with what fmt::format() creates given `fmt` and `args`.
+ *
+ * This method uses the current text location string format
+ * (see textLocStrFmt()) to format `textLoc`.
+ *
+ * If `AppendCauseV` is true, this method also appends a cause to
+ * the error of the current thread using the same message.
*/
- template <bool AppendCauseV, typename... ArgTs>
- [[noreturn]] void logErrorErrnoAndRethrow(const char * const fileName,
- const char * const funcName,
- const unsigned int lineNo, const char * const initMsg,
- const char * const fmt, ArgTs&&...args) const
+ template <Level LevelV, bool AppendCauseV, typename... ArgTs>
+ void logTextLoc(const char * const fileName, const char * const funcName,
+ const unsigned int lineNo, const TextLoc& textLoc,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
- this->logErrnoNoThrow<Level::ERROR, AppendCauseV>(fileName, funcName, lineNo, initMsg, fmt,
- std::forward<ArgTs>(args)...);
- throw;
+ this->_log<_InitMsgLogWriter, LevelV, AppendCauseV>(
+ fileName, funcName, lineNo, {}, this->_textLocPrefixStr(textLoc).c_str(), fmt,
+ std::forward<ArgTs>(args)...);
}
/*
- * Like logErrnoStrNoThrow() with the `Level::ERROR` level, but also
+ * Like logTextLoc() with the `Level::Error` level, but also throws
+ * a default-constructed instance of `ExcT`.
+ */
+ template <bool AppendCauseV, typename ExcT, typename... ArgTs>
+ [[noreturn]] void
+ logErrorTextLocAndThrow(const char * const fileName, const char * const funcName,
+ const unsigned int lineNo, const TextLoc& textLoc,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
+ {
+ this->logTextLoc<Level::Error, AppendCauseV>(fileName, funcName, lineNo, textLoc, fmt,
+ std::forward<ArgTs>(args)...);
+ throw ExcT {};
+ }
+
+ /*
+ * Like logTextLoc() with the `Level::Error` level, but also
* rethrows.
*/
- template <bool AppendCauseV>
+ template <bool AppendCauseV, typename... ArgTs>
[[noreturn]] void
- logErrorErrnoStrAndRethrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const char * const initMsg,
- const char * const msg) const
+ logErrorTextLocAndRethrow(const char * const fileName, const char * const funcName,
+ const unsigned int lineNo, const TextLoc& textLoc,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
- this->logErrnoStrNoThrow<Level::ERROR, AppendCauseV>(fileName, funcName, lineNo, initMsg,
- msg);
+ this->logTextLoc<Level::Error, AppendCauseV>(fileName, funcName, lineNo, textLoc, fmt,
+ std::forward<ArgTs>(args)...);
throw;
}
{
static void write(const char * const fileName, const char * const funcName,
const unsigned lineNo, const Level level, const char * const tag,
- const void * const memData, const unsigned int memLen, const char *,
- const char * const msg) noexcept
+ const ConstBytes memData, const char *, const char * const msg) noexcept
{
bt_log_write_mem(funcName, fileName, lineNo, static_cast<bt_log_level>(level), tag,
- memData, memLen, msg);
+ memData.data(), memData.size(), msg);
}
};
* the log message.
*/
template <Level LevelV, typename... ArgTs>
- void logMemNoThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const void * const memData,
- const unsigned int memLen, const char * const fmt, ArgTs&&...args) const
- {
- this->_logNoThrow<_MemLogWriter, LevelV, false>(fileName, funcName, lineNo, memData, memLen,
- "", fmt, std::forward<ArgTs>(args)...);
- }
-
- /*
- * Logs memory data using the level `LevelV`, starting with the
- * message `msg`.
- */
- template <Level LevelV>
- void logMemStrNoThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const void * const memData,
- const unsigned int memLen, const char * const msg) const
+ void logMem(const char * const fileName, const char * const funcName, const unsigned int lineNo,
+ const ConstBytes memData, fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
- this->_logStrNoThrow<_MemLogWriter, LevelV, false>(fileName, funcName, lineNo, memData,
- memLen, "", msg);
+ this->_log<_MemLogWriter, LevelV, false>(fileName, funcName, lineNo, memData, "",
+ std::move(fmt), std::forward<ArgTs>(args)...);
}
private:
/*
* Formats a log message with fmt::format() given `fmt` and `args`,
- * and then forwards everything to _logStrNoThrow().
+ * and then:
+ *
+ * 1. Calls LogWriterT::write() with its arguments to log using the
+ * level `LevelV`.
+ *
+ * 2. If `AppendCauseV` is true, this method also appends a cause to
+ * the error of the current thread using the concatenation of
+ * `initMsg` and `msg` as the message.
*/
template <typename LogWriterT, Level LevelV, bool AppendCauseV, typename... ArgTs>
- void _logNoThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const void * const memData,
- const std::size_t memLen, const char * const initMsg, const char * const fmt,
- ArgTs&&...args) const
+ void _log(const char * const fileName, const char * const funcName, const unsigned int lineNo,
+ const ConstBytes memData, const char * const initMsg,
+ fmt::format_string<ArgTs...> fmt, ArgTs&&...args) const
{
+ const auto wouldLog = this->wouldLog(LevelV);
+
/* Only format arguments if logging or appending an error cause */
- if (G_UNLIKELY(this->wouldLog(LevelV) || AppendCauseV)) {
+ if (G_UNLIKELY(wouldLog || AppendCauseV)) {
/*
* Format arguments to our buffer (fmt::format_to() doesn't
* append a null character).
*/
_mBuf.clear();
- fmt::format_to(std::back_inserter(_mBuf), fmt, std::forward<ArgTs>(args)...);
+ fmt::format_to(std::back_inserter(_mBuf), std::move(fmt), std::forward<ArgTs>(args)...);
_mBuf.push_back('\0');
}
- this->_logStrNoThrow<LogWriterT, LevelV, AppendCauseV>(fileName, funcName, lineNo, memData,
- memLen, initMsg, _mBuf.data());
- }
-
- /*
- * Calls LogWriterT::write() with its arguments to log using the
- * level `LevelV`.
- *
- * If `AppendCauseV` is true, this method also appends a cause to
- * the error of the current thread using the concatenation of
- * `initMsg` and `msg` as the message.
- */
- template <typename LogWriterT, Level LevelV, bool AppendCauseV>
- void _logStrNoThrow(const char * const fileName, const char * const funcName,
- const unsigned int lineNo, const void * const memData,
- const std::size_t memLen, const char * const initMsg,
- const char * const msg) const
- {
- /* Initial message and main message are required */
+ /* Initial message is required */
BT_ASSERT(initMsg);
- BT_ASSERT(msg);
/* Log if needed */
- if (this->wouldLog(LevelV)) {
- LogWriterT::write(fileName, funcName, lineNo, LevelV, _mTag.data(), memData, memLen,
- initMsg, msg);
+ if (wouldLog) {
+ LogWriterT::write(fileName, funcName, lineNo, LevelV, _mTag.data(), memData, initMsg,
+ _mBuf.data());
}
/* Append an error cause if needed */
if (AppendCauseV) {
- if (_mSelfMsgIter) {
- bt_current_thread_error_append_cause_from_message_iterator(
- _mSelfMsgIter->libObjPtr(), fileName, lineNo, "%s%s", initMsg, msg);
- } else if (_mSelfComp) {
- bt_current_thread_error_append_cause_from_component(
- _mSelfComp->libObjPtr(), fileName, lineNo, "%s%s", initMsg, msg);
- } else if (_mSelfCompCls) {
- bt_current_thread_error_append_cause_from_component_class(
- _mSelfCompCls->libObjPtr(), fileName, lineNo, "%s%s", initMsg, msg);
- } else {
- BT_ASSERT(_mModuleName);
- bt_current_thread_error_append_cause_from_unknown(_mModuleName->data(), fileName,
- lineNo, "%s%s", initMsg, msg);
- }
+ this->appendCauseStr(fileName, lineNo, initMsg, _mBuf.data());
}
}
return fmt::format("{}: {}", initMsg, g_strerror(errno));
}
+ std::string _textLocPrefixStr(const TextLoc& loc) const
+ {
+ return fmt::format("[{}] ", textLocStr(loc, _mTextLocStrFmt));
+ }
+
/* Exactly one of the following four members has a value */
bt2s::optional<bt2::SelfComponentClass> _mSelfCompCls;
bt2s::optional<bt2::SelfComponent> _mSelfComp;
/* Logging tag */
std::string _mTag;
+ /* Current text location string format */
+ TextLocStrFmt _mTextLocStrFmt = TextLocStrFmt::LineColNosAndOffset;
+
/* Formatting buffer */
mutable std::vector<char> _mBuf;
};
+/*
+ * Returns `s` if it's not `nullptr`, or the `(null)` string otherwise.
+ */
+inline const char *maybeNull(const char * const s) noexcept
+{
+ return s ? s : "(null)";
+}
+
} /* namespace bt2c */
/* Internal: default logger name */
#define _BT_CPPLOG_DEF_LOGGER _mLogger
/*
- * Calls logNoThrow() on `_logger` to log using the level `_lvl` without
- * appending nor throwing.
+ * Calls log() on `_logger` to log using the level `_lvl`.
*/
#define BT_CPPLOG_EX(_lvl, _logger, _fmt, ...) \
do { \
if (G_UNLIKELY((_logger).wouldLog(_lvl))) { \
- (_logger).logNoThrow<(_lvl), false>(__FILE__, __func__, __LINE__, (_fmt), \
- ##__VA_ARGS__); \
+ (_logger).template log<(_lvl), false>(__FILE__, __func__, __LINE__, (_fmt), \
+ ##__VA_ARGS__); \
} \
} while (0)
* BT_CPPLOG_EX() with specific logging levels.
*/
#define BT_CPPLOGT_SPEC(_logger, _fmt, ...) \
- BT_CPPLOG_EX(bt2c::Logger::Level::TRACE, (_logger), (_fmt), ##__VA_ARGS__)
+ BT_CPPLOG_EX(bt2c::Logger::Level::Trace, (_logger), (_fmt), ##__VA_ARGS__)
#define BT_CPPLOGD_SPEC(_logger, _fmt, ...) \
- BT_CPPLOG_EX(bt2c::Logger::Level::DEBUG, (_logger), (_fmt), ##__VA_ARGS__)
+ BT_CPPLOG_EX(bt2c::Logger::Level::Debug, (_logger), (_fmt), ##__VA_ARGS__)
#define BT_CPPLOGI_SPEC(_logger, _fmt, ...) \
- BT_CPPLOG_EX(bt2c::Logger::Level::INFO, (_logger), (_fmt), ##__VA_ARGS__)
+ BT_CPPLOG_EX(bt2c::Logger::Level::Info, (_logger), (_fmt), ##__VA_ARGS__)
#define BT_CPPLOGW_SPEC(_logger, _fmt, ...) \
- BT_CPPLOG_EX(bt2c::Logger::Level::WARNING, (_logger), (_fmt), ##__VA_ARGS__)
+ BT_CPPLOG_EX(bt2c::Logger::Level::Warning, (_logger), (_fmt), ##__VA_ARGS__)
#define BT_CPPLOGE_SPEC(_logger, _fmt, ...) \
- BT_CPPLOG_EX(bt2c::Logger::Level::ERROR, (_logger), (_fmt), ##__VA_ARGS__)
+ BT_CPPLOG_EX(bt2c::Logger::Level::Error, (_logger), (_fmt), ##__VA_ARGS__)
#define BT_CPPLOGF_SPEC(_logger, _fmt, ...) \
- BT_CPPLOG_EX(bt2c::Logger::Level::FATAL, (_logger), (_fmt), ##__VA_ARGS__)
+ BT_CPPLOG_EX(bt2c::Logger::Level::Fatal, (_logger), (_fmt), ##__VA_ARGS__)
/*
* BT_CPPLOG_EX() with specific logging levels and using the default
#define BT_CPPLOGF(_fmt, ...) BT_CPPLOGF_SPEC(_BT_CPPLOG_DEF_LOGGER, (_fmt), ##__VA_ARGS__)
/*
- * Calls logStrNoThrow() on `_logger` to log using the level `_lvl`
- * without appending nor throwing.
- */
-#define BT_CPPLOG_STR_EX(_lvl, _logger, _msg) \
- (_logger).logStrNoThrow<(_lvl), false>(__FILE__, __func__, __LINE__, (_msg))
-
-/*
- * BT_CPPLOG_STR_EX() with specific logging levels.
- */
-#define BT_CPPLOGT_STR_SPEC(_logger, _msg) \
- BT_CPPLOG_STR_EX(bt2c::Logger::Level::TRACE, (_logger), (_msg))
-#define BT_CPPLOGD_STR_SPEC(_logger, _msg) \
- BT_CPPLOG_STR_EX(bt2c::Logger::Level::DEBUG, (_logger), (_msg))
-#define BT_CPPLOGI_STR_SPEC(_logger, _msg) \
- BT_CPPLOG_STR_EX(bt2c::Logger::Level::INFO, (_logger), (_msg))
-#define BT_CPPLOGW_STR_SPEC(_logger, _msg) \
- BT_CPPLOG_STR_EX(bt2c::Logger::Level::WARNING, (_logger), (_msg))
-#define BT_CPPLOGE_STR_SPEC(_logger, _msg) \
- BT_CPPLOG_STR_EX(bt2c::Logger::Level::ERROR, (_logger), (_msg))
-#define BT_CPPLOGF_STR_SPEC(_logger, _msg) \
- BT_CPPLOG_STR_EX(bt2c::Logger::Level::FATAL, (_logger), (_msg))
-
-/*
- * BT_CPPLOG_STR_EX() with specific logging levels and using the default
- * logger.
- */
-#define BT_CPPLOGT_STR(_msg) BT_CPPLOGT_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_msg))
-#define BT_CPPLOGD_STR(_msg) BT_CPPLOGD_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_msg))
-#define BT_CPPLOGI_STR(_msg) BT_CPPLOGI_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_msg))
-#define BT_CPPLOGW_STR(_msg) BT_CPPLOGW_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_msg))
-#define BT_CPPLOGE_STR(_msg) BT_CPPLOGE_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_msg))
-#define BT_CPPLOGF_STR(_msg) BT_CPPLOGF_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_msg))
-
-/*
- * Calls logMemNoThrow() on `_logger` to log using the level `_lvl`
- * without appending nor throwing.
+ * Calls logMem() on `_logger` to log using the level `_lvl`.
*/
-#define BT_CPPLOG_MEM_EX(_lvl, _logger, _mem_data, _mem_len, _fmt, ...) \
+#define BT_CPPLOG_MEM_EX(_lvl, _logger, _memData, _fmt, ...) \
do { \
if (G_UNLIKELY((_logger).wouldLog(_lvl))) { \
- (_logger).logMemNoThrow<(_lvl)>(__FILE__, __func__, __LINE__, (_mem_data), (_mem_len), \
- (_fmt), ##__VA_ARGS__); \
+ (_logger).template logMem<(_lvl)>(__FILE__, __func__, __LINE__, (_memData), (_fmt), \
+ ##__VA_ARGS__); \
} \
} while (0)
/*
* BT_CPPLOG_MEM_EX() with specific logging levels.
*/
-#define BT_CPPLOGT_MEM_SPEC(_logger, _mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOG_MEM_EX(bt2c::Logger::Level::TRACE, (_logger), (_mem_data), (_mem_len), (_fmt), \
- ##__VA_ARGS__)
-#define BT_CPPLOGD_MEM_SPEC(_logger, _mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOG_MEM_EX(bt2c::Logger::Level::DEBUG, (_logger), (_mem_data), (_mem_len), (_fmt), \
- ##__VA_ARGS__)
-#define BT_CPPLOGI_MEM_SPEC(_logger, _mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOG_MEM_EX(bt2c::Logger::Level::INFO, (_logger), (_mem_data), (_mem_len), (_fmt), \
- ##__VA_ARGS__)
-#define BT_CPPLOGW_MEM_SPEC(_logger, _mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOG_MEM_EX(bt2c::Logger::Level::WARNING, (_logger), (_mem_data), (_mem_len), (_fmt), \
- ##__VA_ARGS__)
-#define BT_CPPLOGE_MEM_SPEC(_logger, _mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOG_MEM_EX(bt2c::Logger::Level::ERROR, (_logger), (_mem_data), (_mem_len), (_fmt), \
- ##__VA_ARGS__)
-#define BT_CPPLOGF_MEM_SPEC(_logger, _mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOG_MEM_EX(bt2c::Logger::Level::FATAL, (_logger), (_mem_data), (_mem_len), (_fmt), \
- ##__VA_ARGS__)
+#define BT_CPPLOGT_MEM_SPEC(_logger, _memData, _fmt, ...) \
+ BT_CPPLOG_MEM_EX(bt2c::Logger::Level::Trace, (_logger), (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGD_MEM_SPEC(_logger, _memData, _fmt, ...) \
+ BT_CPPLOG_MEM_EX(bt2c::Logger::Level::Debug, (_logger), (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGI_MEM_SPEC(_logger, _memData, _fmt, ...) \
+ BT_CPPLOG_MEM_EX(bt2c::Logger::Level::Info, (_logger), (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGW_MEM_SPEC(_logger, _memData, _fmt, ...) \
+ BT_CPPLOG_MEM_EX(bt2c::Logger::Level::Warning, (_logger), (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGE_MEM_SPEC(_logger, _memData, _fmt, ...) \
+ BT_CPPLOG_MEM_EX(bt2c::Logger::Level::Error, (_logger), (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGF_MEM_SPEC(_logger, _memData, _fmt, ...) \
+ BT_CPPLOG_MEM_EX(bt2c::Logger::Level::Fatal, (_logger), (_memData), (_fmt), ##__VA_ARGS__)
/*
* BT_CPPLOG_MEM_EX() with specific logging levels and using the default
* logger.
*/
-#define BT_CPPLOGT_MEM(_mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOGT_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGD_MEM(_mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOGD_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGI_MEM(_mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOGI_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGW_MEM(_mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOGW_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGE_MEM(_mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOGE_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGF_MEM(_mem_data, _mem_len, _fmt, ...) \
- BT_CPPLOGF_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_fmt), ##__VA_ARGS__)
-
-/*
- * Calls logMemStrNoThrow() on `_logger` to log using the level `_lvl`
- * without appending nor throwing.
- */
-#define BT_CPPLOG_MEM_STR_EX(_lvl, _logger, _mem_data, _mem_len, _msg) \
- (_logger).logMemStrNoThrow<(_lvl)>(__FILE__, __func__, __LINE__, (_mem_data), (_mem_len), \
- (_msg))
-
-/*
- * BT_CPPLOG_MEM_STR_EX() with specific logging levels.
- */
-#define BT_CPPLOGT_MEM_STR_SPEC(_logger, _mem_data, _mem_len, _msg) \
- BT_CPPLOG_MEM_STR_EX(bt2c::Logger::Level::TRACE, (_logger), (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGD_MEM_STR_SPEC(_logger, _mem_data, _mem_len, _msg) \
- BT_CPPLOG_MEM_STR_EX(bt2c::Logger::Level::DEBUG, (_logger), (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGI_MEM_STR_SPEC(_logger, _mem_data, _mem_len, _msg) \
- BT_CPPLOG_MEM_STR_EX(bt2c::Logger::Level::INFO, (_logger), (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGW_MEM_STR_SPEC(_logger, _mem_data, _mem_len, _msg) \
- BT_CPPLOG_MEM_STR_EX(bt2c::Logger::Level::WARNING, (_logger), (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGE_MEM_STR_SPEC(_logger, _mem_data, _mem_len, _msg) \
- BT_CPPLOG_MEM_STR_EX(bt2c::Logger::Level::ERROR, (_logger), (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGF_MEM_STR_SPEC(_logger, _mem_data, _mem_len, _msg) \
- BT_CPPLOG_MEM_STR_EX(bt2c::Logger::Level::FATAL, (_logger), (_mem_data), (_mem_len), (_msg))
-
-/*
- * BT_CPPLOG_MEM_STR_EX() with specific logging levels and using the
- * default logger.
- */
-#define BT_CPPLOGT_MEM_STR(_mem_data, _mem_len, _msg) \
- BT_CPPLOGT_MEM_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGD_MEM_STR(_mem_data, _mem_len, _msg) \
- BT_CPPLOGD_MEM_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGI_MEM_STR(_mem_data, _mem_len, _msg) \
- BT_CPPLOGI_MEM_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGW_MEM_STR(_mem_data, _mem_len, _msg) \
- BT_CPPLOGW_MEM_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGE_MEM_STR(_mem_data, _mem_len, _msg) \
- BT_CPPLOGE_MEM_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_msg))
-#define BT_CPPLOGF_MEM_STR(_mem_data, _mem_len, _msg) \
- BT_CPPLOGF_MEM_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_mem_data), (_mem_len), (_msg))
+#define BT_CPPLOGT_MEM(_memData, _fmt, ...) \
+ BT_CPPLOGT_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGD_MEM(_memData, _fmt, ...) \
+ BT_CPPLOGD_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGI_MEM(_memData, _fmt, ...) \
+ BT_CPPLOGI_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGW_MEM(_memData, _fmt, ...) \
+ BT_CPPLOGW_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGE_MEM(_memData, _fmt, ...) \
+ BT_CPPLOGE_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_memData), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGF_MEM(_memData, _fmt, ...) \
+ BT_CPPLOGF_MEM_SPEC(_BT_CPPLOG_DEF_LOGGER, (_memData), (_fmt), ##__VA_ARGS__)
/*
- * Calls logErrnoNoThrow() on `_logger` to log using the level `_lvl`
- * and initial message `_init_msg` without appending nor throwing.
+ * Calls logErrno() on `_logger` to log using the level `_lvl` and
+ * initial message `_initMsg`.
*/
-#define BT_CPPLOG_ERRNO_EX(_lvl, _logger, _init_msg, _fmt, ...) \
+#define BT_CPPLOG_ERRNO_EX(_lvl, _logger, _initMsg, _fmt, ...) \
do { \
if (G_UNLIKELY((_logger).wouldLog(_lvl))) { \
- (_logger).logErrnoNoThrow<(_lvl), false>(__FILE__, __func__, __LINE__, (_init_msg), \
- (_fmt), ##__VA_ARGS__); \
+ (_logger).template logErrno<(_lvl), false>(__FILE__, __func__, __LINE__, (_initMsg), \
+ (_fmt), ##__VA_ARGS__); \
} \
} while (0)
/*
* BT_CPPLOG_ERRNO_EX() with specific logging levels.
*/
-#define BT_CPPLOGT_ERRNO_SPEC(_logger, _init_msg, _fmt, ...) \
- BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::TRACE, (_logger), (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGD_ERRNO_SPEC(_logger, _init_msg, _fmt, ...) \
- BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::DEBUG, (_logger), (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGI_ERRNO_SPEC(_logger, _init_msg, _fmt, ...) \
- BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::INFO, (_logger), (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGW_ERRNO_SPEC(_logger, _init_msg, _fmt, ...) \
- BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::WARNING, (_logger), (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGE_ERRNO_SPEC(_logger, _init_msg, _fmt, ...) \
- BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::ERROR, (_logger), (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGF_ERRNO_SPEC(_logger, _init_msg, _fmt, ...) \
- BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::FATAL, (_logger), (_init_msg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGT_ERRNO_SPEC(_logger, _initMsg, _fmt, ...) \
+ BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::Trace, (_logger), (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGD_ERRNO_SPEC(_logger, _initMsg, _fmt, ...) \
+ BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::Debug, (_logger), (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGI_ERRNO_SPEC(_logger, _initMsg, _fmt, ...) \
+ BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::Info, (_logger), (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGW_ERRNO_SPEC(_logger, _initMsg, _fmt, ...) \
+ BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::Warning, (_logger), (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGE_ERRNO_SPEC(_logger, _initMsg, _fmt, ...) \
+ BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::Error, (_logger), (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGF_ERRNO_SPEC(_logger, _initMsg, _fmt, ...) \
+ BT_CPPLOG_ERRNO_EX(bt2c::Logger::Level::Fatal, (_logger), (_initMsg), (_fmt), ##__VA_ARGS__)
/*
* BT_CPPLOG_ERRNO_EX() with specific logging levels and using the
* default logger.
*/
-#define BT_CPPLOGT_ERRNO(_init_msg, _fmt, ...) \
- BT_CPPLOGT_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGD_ERRNO(_init_msg, _fmt, ...) \
- BT_CPPLOGD_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGI_ERRNO(_init_msg, _fmt, ...) \
- BT_CPPLOGI_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGW_ERRNO(_init_msg, _fmt, ...) \
- BT_CPPLOGW_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGE_ERRNO(_init_msg, _fmt, ...) \
- BT_CPPLOGE_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_fmt), ##__VA_ARGS__)
-#define BT_CPPLOGF_ERRNO(_init_msg, _fmt, ...) \
- BT_CPPLOGF_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGT_ERRNO(_initMsg, _fmt, ...) \
+ BT_CPPLOGT_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGD_ERRNO(_initMsg, _fmt, ...) \
+ BT_CPPLOGD_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGI_ERRNO(_initMsg, _fmt, ...) \
+ BT_CPPLOGI_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGW_ERRNO(_initMsg, _fmt, ...) \
+ BT_CPPLOGW_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGE_ERRNO(_initMsg, _fmt, ...) \
+ BT_CPPLOGE_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_initMsg), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGF_ERRNO(_initMsg, _fmt, ...) \
+ BT_CPPLOGF_ERRNO_SPEC(_BT_CPPLOG_DEF_LOGGER, (_initMsg), (_fmt), ##__VA_ARGS__)
/*
- * Calls logErrnoStrNoThrow() on `_logger` to log using the level `_lvl`
- * and initial message `_init_msg` without appending nor throwing.
+ * Calls logTextLoc() on `_logger` to log using the level `_lvl` and
+ * text location `_textLoc`.
*/
-#define BT_CPPLOG_ERRNO_STR_EX(_lvl, _logger, _init_msg, _msg) \
- (_logger).logErrnoStrNoThrow<(_lvl), false>(__FILE__, __func__, __LINE__, (_init_msg), (_msg))
+#define BT_CPPLOG_TEXT_LOC_EX(_lvl, _logger, _textLoc, _fmt, ...) \
+ do { \
+ if (G_UNLIKELY((_logger).wouldLog(_lvl))) { \
+ (_logger).template logTextLoc<(_lvl), false>(__FILE__, __func__, __LINE__, (_textLoc), \
+ (_fmt), ##__VA_ARGS__); \
+ } \
+ } while (0)
/*
- * BT_CPPLOG_ERRNO_STR_EX() with specific logging levels.
+ * BT_CPPLOG_TEXT_LOC_EX() with specific logging levels.
*/
-#define BT_CPPLOGT_ERRNO_STR_SPEC(_logger, _init_msg, _msg) \
- BT_CPPLOG_ERRNO_STR_EX(bt2c::Logger::Level::TRACE, (_logger), (_init_msg), (_msg))
-#define BT_CPPLOGD_ERRNO_STR_SPEC(_logger, _init_msg, _msg) \
- BT_CPPLOG_ERRNO_STR_EX(bt2c::Logger::Level::DEBUG, (_logger), (_init_msg), (_msg))
-#define BT_CPPLOGI_ERRNO_STR_SPEC(_logger, _init_msg, _msg) \
- BT_CPPLOG_ERRNO_STR_EX(bt2c::Logger::Level::INFO, (_logger), (_init_msg), (_msg))
-#define BT_CPPLOGW_ERRNO_STR_SPEC(_logger, _init_msg, _msg) \
- BT_CPPLOG_ERRNO_STR_EX(bt2c::Logger::Level::WARNING, (_logger), (_init_msg), (_msg))
-#define BT_CPPLOGE_ERRNO_STR_SPEC(_logger, _init_msg, _msg) \
- BT_CPPLOG_ERRNO_STR_EX(bt2c::Logger::Level::ERROR, (_logger), (_init_msg), (_msg))
-#define BT_CPPLOGF_ERRNO_STR_SPEC(_logger, _init_msg, _msg) \
- BT_CPPLOG_ERRNO_STR_EX(bt2c::Logger::Level::FATAL, (_logger), (_init_msg), (_msg))
+#define BT_CPPLOGT_TEXT_LOC_SPEC(_logger, _textLoc, _fmt, ...) \
+ BT_CPPLOG_TEXT_LOC_EX(bt2c::Logger::Level::Trace, (_logger), (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGD_TEXT_LOC_SPEC(_logger, _textLoc, _fmt, ...) \
+ BT_CPPLOG_TEXT_LOC_EX(bt2c::Logger::Level::Debug, (_logger), (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGI_TEXT_LOC_SPEC(_logger, _textLoc, _fmt, ...) \
+ BT_CPPLOG_TEXT_LOC_EX(bt2c::Logger::Level::Info, (_logger), (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGW_TEXT_LOC_SPEC(_logger, _textLoc, _fmt, ...) \
+ BT_CPPLOG_TEXT_LOC_EX(bt2c::Logger::Level::Warning, (_logger), (_textLoc), (_fmt), \
+ ##__VA_ARGS__)
+#define BT_CPPLOGE_TEXT_LOC_SPEC(_logger, _textLoc, _fmt, ...) \
+ BT_CPPLOG_TEXT_LOC_EX(bt2c::Logger::Level::Error, (_logger), (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGF_TEXT_LOC_SPEC(_logger, _textLoc, _fmt, ...) \
+ BT_CPPLOG_TEXT_LOC_EX(bt2c::Logger::Level::Fatal, (_logger), (_textLoc), (_fmt), ##__VA_ARGS__)
/*
- * BT_CPPLOG_ERRNO_STR_EX() with specific logging levels and using the
+ * BT_CPPLOG_TEXT_LOC_EX() with specific logging levels and using the
* default logger.
*/
-#define BT_CPPLOGT_ERRNO_STR(_init_msg, _msg) \
- BT_CPPLOGT_ERRNO_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_msg))
-#define BT_CPPLOGD_ERRNO_STR(_init_msg, _msg) \
- BT_CPPLOGD_ERRNO_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_msg))
-#define BT_CPPLOGI_ERRNO_STR(_init_msg, _msg) \
- BT_CPPLOGI_ERRNO_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_msg))
-#define BT_CPPLOGW_ERRNO_STR(_init_msg, _msg) \
- BT_CPPLOGW_ERRNO_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_msg))
-#define BT_CPPLOGE_ERRNO_STR(_init_msg, _msg) \
- BT_CPPLOGE_ERRNO_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_msg))
-#define BT_CPPLOGF_ERRNO_STR(_init_msg, _msg) \
- BT_CPPLOGF_ERRNO_STR_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_msg))
+#define BT_CPPLOGT_TEXT_LOC(_textLoc, _fmt, ...) \
+ BT_CPPLOGT_TEXT_LOC_SPEC(_BT_CPPLOG_DEF_LOGGER, (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGD_TEXT_LOC(_textLoc, _fmt, ...) \
+ BT_CPPLOGD_TEXT_LOC_SPEC(_BT_CPPLOG_DEF_LOGGER, (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGI_TEXT_LOC(_textLoc, _fmt, ...) \
+ BT_CPPLOGI_TEXT_LOC_SPEC(_BT_CPPLOG_DEF_LOGGER, (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGW_TEXT_LOC(_textLoc, _fmt, ...) \
+ BT_CPPLOGW_TEXT_LOC_SPEC(_BT_CPPLOG_DEF_LOGGER, (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGE_TEXT_LOC(_textLoc, _fmt, ...) \
+ BT_CPPLOGE_TEXT_LOC_SPEC(_BT_CPPLOG_DEF_LOGGER, (_textLoc), (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGF_TEXT_LOC(_textLoc, _fmt, ...) \
+ BT_CPPLOGF_TEXT_LOC_SPEC(_BT_CPPLOG_DEF_LOGGER, (_textLoc), (_fmt), ##__VA_ARGS__)
/*
- * Calls logErrorAndThrow() on `_logger` to log an error, append a cause
- * to the error of the current thread, and throw an instance of
- * `_exc_cls`.
+ * Calls log() on `_logger` with the `Error` level to log an error and
+ * append a cause to the error of the current thread.
*/
-#define BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(_logger, _exc_cls, _fmt, ...) \
- (_logger).logErrorAndThrow<true, _exc_cls>(__FILE__, __func__, __LINE__, (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGE_APPEND_CAUSE_SPEC(_logger, _fmt, ...) \
+ (_logger).template log<bt2c::Logger::Level::Error, true>(__FILE__, __func__, __LINE__, (_fmt), \
+ ##__VA_ARGS__)
/*
- * BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC() using the default logger.
+ * BT_CPPLOGE_APPEND_CAUSE_SPEC() using the default logger.
*/
-#define BT_CPPLOGE_APPEND_CAUSE_AND_THROW(_exc_cls, _fmt, ...) \
- BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(_BT_CPPLOG_DEF_LOGGER, _exc_cls, (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGE_APPEND_CAUSE(_fmt, ...) \
+ BT_CPPLOGE_APPEND_CAUSE_SPEC(_BT_CPPLOG_DEF_LOGGER, (_fmt), ##__VA_ARGS__)
/*
- * Calls logErrorStrAndThrow() on `_logger` to log an error, append a
- * cause to the error of the current thread, and throw an instance of
- * `_exc_cls`.
+ * Calls logErrorAndThrow() on `_logger` to log an error, append a cause
+ * to the error of the current thread, and throw an instance of
+ * `_excCls`.
*/
-#define BT_CPPLOGE_STR_APPEND_CAUSE_AND_THROW_SPEC(_logger, _exc_cls, _msg) \
- (_logger).logErrorStrAndThrow<true, _exc_cls>(__FILE__, __func__, __LINE__, (_msg))
+#define BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(_logger, _excCls, _fmt, ...) \
+ (_logger).template logErrorAndThrow<true, _excCls>(__FILE__, __func__, __LINE__, (_fmt), \
+ ##__VA_ARGS__)
/*
- * BT_CPPLOGE_STR_APPEND_CAUSE_AND_THROW_SPEC() using the default
- * logger.
+ * BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC() using the default logger.
*/
-#define BT_CPPLOGE_STR_APPEND_CAUSE_AND_THROW(_exc_cls, _msg) \
- BT_CPPLOGE_STR_APPEND_CAUSE_AND_THROW_SPEC(_BT_CPPLOG_DEF_LOGGER, _exc_cls, (_msg))
+#define BT_CPPLOGE_APPEND_CAUSE_AND_THROW(_excCls, _fmt, ...) \
+ BT_CPPLOGE_APPEND_CAUSE_AND_THROW_SPEC(_BT_CPPLOG_DEF_LOGGER, _excCls, (_fmt), ##__VA_ARGS__)
/*
* Calls logErrorAndRethrow() on `_logger` to log an error, append a
* cause to the error of the current thread, and throw an instance of
- * `_exc_cls`.
+ * `_excCls`.
*/
#define BT_CPPLOGE_APPEND_CAUSE_AND_RETHROW_SPEC(_logger, _fmt, ...) \
- (_logger).logErrorAndRethrow<true>(__FILE__, __func__, __LINE__, (_fmt), ##__VA_ARGS__)
+ (_logger).template logErrorAndRethrow<true>(__FILE__, __func__, __LINE__, (_fmt), ##__VA_ARGS__)
/*
* BT_CPPLOGE_APPEND_CAUSE_AND_RETHROW_SPEC() using the default logger.
BT_CPPLOGE_APPEND_CAUSE_AND_RETHROW_SPEC(_BT_CPPLOG_DEF_LOGGER, (_fmt), ##__VA_ARGS__)
/*
- * Calls logErrorStrAndRethrow() on `_logger` to log an error, append a
- * cause to the error of the current thread, and throw an instance of
- * `_exc_cls`.
+ * Calls logErrno() on `_logger` with the `Level::Error` level to log an
+ * error and append a cause to the error of the current thread.
*/
-#define BT_CPPLOGE_STR_APPEND_CAUSE_AND_RETHROW_SPEC(_logger, _msg) \
- (_logger).logErrorStrAndRethrow<true>(__FILE__, __func__, __LINE__, (_msg))
+#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_SPEC(_logger, _initMsg, _fmt, ...) \
+ (_logger).template logErrno<bt2c::Logger::Level::Error, true>( \
+ __FILE__, __func__, __LINE__, (_initMsg), (_fmt), ##__VA_ARGS__)
/*
- * BT_CPPLOGE_STR_APPEND_CAUSE_AND_RETHROW_SPEC() using the default
- * logger.
+ * BT_CPPLOGE_ERRNO_APPEND_CAUSE_SPEC() using the default logger.
*/
-#define BT_CPPLOGE_STR_APPEND_CAUSE_AND_RETHROW(_msg) \
- BT_CPPLOGE_STR_APPEND_CAUSE_AND_RETHROW_SPEC(_BT_CPPLOG_DEF_LOGGER, (_msg))
+#define BT_CPPLOGE_ERRNO_APPEND_CAUSE(_initMsg, _fmt, ...) \
+ BT_CPPLOGE_ERRNO_APPEND_CAUSE_SPEC(_BT_CPPLOG_DEF_LOGGER, (_initMsg), (_fmt), ##__VA_ARGS__)
/*
* Calls logErrorErrnoAndThrow() on `_logger` to log an error, append a
* cause to the error of the current thread, and throw an instance of
- * `_exc_cls`.
+ * `_excCls`.
*/
-#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_THROW_SPEC(_logger, _exc_cls, _init_msg, _fmt, ...) \
- (_logger).logErrorErrnoAndThrow<true, _exc_cls>(__FILE__, __func__, __LINE__, (_init_msg), \
- (_fmt), ##__VA_ARGS__)
+#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_THROW_SPEC(_logger, _excCls, _initMsg, _fmt, ...) \
+ (_logger).template logErrorErrnoAndThrow<true, _excCls>(__FILE__, __func__, __LINE__, \
+ (_initMsg), (_fmt), ##__VA_ARGS__)
/*
* BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_THROW_SPEC() using the default
* logger.
*/
-#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_THROW(_exc_cls, _init_msg, _fmt, ...) \
- BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_THROW_SPEC(_BT_CPPLOG_DEF_LOGGER, _exc_cls, (_init_msg), \
+#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_THROW(_excCls, _initMsg, _fmt, ...) \
+ BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_THROW_SPEC(_BT_CPPLOG_DEF_LOGGER, _excCls, (_initMsg), \
(_fmt), ##__VA_ARGS__)
/*
- * Calls logErrorErrnoStrAndThrow() on `_logger` to log an error, append
+ * Calls logErrorErrnoAndRethrow() on `_logger` to log an error, append
* a cause to the error of the current thread, and throw an instance of
- * `_exc_cls`.
+ * `_excCls`.
*/
-#define BT_CPPLOGE_ERRNO_STR_APPEND_CAUSE_AND_THROW_SPEC(_logger, _exc_cls, _init_msg, _msg) \
- (_logger).logErrorErrnoStrAndThrow<true, _exc_cls>(__FILE__, __func__, __LINE__, (_init_msg), \
- (_msg))
+#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_RETHROW_SPEC(_logger, _initMsg, _fmt, ...) \
+ (_logger).template logErrorErrnoAndRethrow<true>(__FILE__, __func__, __LINE__, (_initMsg), \
+ (_fmt), ##__VA_ARGS__)
/*
- * BT_CPPLOGE_ERRNO_STR_APPEND_CAUSE_AND_THROW_SPEC() using the default
+ * BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_RETHROW_SPEC() using the default
* logger.
*/
-#define BT_CPPLOGE_ERRNO_STR_APPEND_CAUSE_AND_THROW(_exc_cls, _init_msg, _msg) \
- BT_CPPLOGE_ERRNO_STR_APPEND_CAUSE_AND_THROW_SPEC(_BT_CPPLOG_DEF_LOGGER, _exc_cls, (_init_msg), \
- (_msg))
+#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_RETHROW(_initMsg, _fmt, ...) \
+ BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_RETHROW_SPEC(_BT_CPPLOG_DEF_LOGGER, (_initMsg), (_fmt), \
+ ##__VA_ARGS__)
/*
- * Calls logErrorErrnoAndRethrow() on `_logger` to log an error, append
- * a cause to the error of the current thread, and throw an instance of
- * `_exc_cls`.
+ * Calls logTextLoc() on `_logger` with the `Level::Error` level to log
+ * an error and append a cause to the error of the current thread.
*/
-#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_RETHROW_SPEC(_logger, _init_msg, _fmt, ...) \
- (_logger).logErrorErrnoAndRethrow<true>(__FILE__, __func__, __LINE__, (_init_msg), (_fmt), \
- ##__VA_ARGS__)
+#define BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_SPEC(_logger, _textLoc, _fmt, ...) \
+ (_logger).template logTextLoc<bt2c::Logger::Level::Error, true>( \
+ __FILE__, __func__, __LINE__, (_textLoc), (_fmt), ##__VA_ARGS__)
/*
- * BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_RETHROW_SPEC() using the default
+ * BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_SPEC() using the default logger.
+ */
+#define BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE(_textLoc, _fmt, ...) \
+ BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_SPEC(_BT_CPPLOG_DEF_LOGGER, (_textLoc), (_fmt), ##__VA_ARGS__)
+
+/*
+ * Calls logErrorErrnoAndThrow() on `_logger` to log an error, append a
+ * cause to the error of the current thread, and throw an instance of
+ * `_excCls`.
+ */
+#define BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_AND_THROW_SPEC(_logger, _excCls, _textLoc, _fmt, ...) \
+ (_logger).template logErrorTextLocAndThrow<true, _excCls>(__FILE__, __func__, __LINE__, \
+ (_textLoc), (_fmt), ##__VA_ARGS__)
+
+/*
+ * BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_AND_THROW_SPEC() using the default
* logger.
*/
-#define BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_RETHROW(_init_msg, _fmt, ...) \
- BT_CPPLOGE_ERRNO_APPEND_CAUSE_AND_RETHROW_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_fmt), \
- ##__VA_ARGS__)
+#define BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_AND_THROW(_excCls, _textLoc, _fmt, ...) \
+ BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_AND_THROW_SPEC(_BT_CPPLOG_DEF_LOGGER, _excCls, (_textLoc), \
+ (_fmt), ##__VA_ARGS__)
/*
- * Calls logErrorErrnoStrAndRethrow() on `_logger` to log an error,
- * append a cause to the error of the current thread, and throw an
- * instance of `_exc_cls`.
+ * Calls logErrorErrnoAndRethrow() on `_logger` to log an error, append
+ * a cause to the error of the current thread, and throw an instance of
+ * `_excCls`.
*/
-#define BT_CPPLOGE_ERRNO_STR_APPEND_CAUSE_AND_RETHROW_SPEC(_logger, _init_msg, _msg) \
- (_logger).logErrorErrnoStrAndRethrow<true>(__FILE__, __func__, __LINE__, (_init_msg), (_msg))
+#define BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_AND_RETHROW_SPEC(_logger, _textLoc, _fmt, ...) \
+ (_logger).template logErrorTextLocAndRethrow<true>(__FILE__, __func__, __LINE__, (_textLoc), \
+ (_fmt), ##__VA_ARGS__)
/*
- * BT_CPPLOGE_ERRNO_STR_APPEND_CAUSE_AND_RETHROW_SPEC() using the
- * default logger.
+ * BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_AND_RETHROW_SPEC() using the default
+ * logger.
*/
-#define BT_CPPLOGE_ERRNO_STR_APPEND_CAUSE_AND_RETHROW(_init_msg, _msg) \
- BT_CPPLOGE_ERRNO_STR_APPEND_CAUSE_AND_RETHROW_SPEC(_BT_CPPLOG_DEF_LOGGER, (_init_msg), (_msg))
+#define BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_AND_RETHROW(_textLoc, _fmt, ...) \
+ BT_CPPLOGE_TEXT_LOC_APPEND_CAUSE_AND_RETHROW_SPEC(_BT_CPPLOG_DEF_LOGGER, (_textLoc), (_fmt), \
+ ##__VA_ARGS__)
#endif /* BABELTRACE_CPP_COMMON_BT2C_LOGGING_HPP */