20 #include <shared_mutex>
33 #define QX_LOG_C(category, eVerbosity, ...) _QX_LOG_C(constexpr, category, eVerbosity, ##__VA_ARGS__)
40 #define QX_LOG(eVerbosity, ...) QX_LOG_C(QX_GET_FILE_CATEGORY(), eVerbosity, ##__VA_ARGS__)
48 #define QX_LOG_REF(category, eVerbosity, ...) _QX_LOG_C(, category, eVerbosity, ##__VA_ARGS__)
66 #if QX_CLANG || QX_APPLE_CLANG || QX_GNU
75 using format_signature =
string(
79 std::chrono::system_clock::time_point,
84 using format_function_pointer = format_signature*;
85 using format_function = std::function<format_signature>;
89 verbosity eRuntimeVerbosity = verbosity::detailed;
90 format_function formatFunction;
93 using category_data_map = std::unordered_map<string_view, category_data>;
96 enum class message_necessity_type
99 default_verbosity = 1 << 0,
100 category_verbosity = 1 << 1,
101 one_of_streams_requires = 1 << 2
106 virtual ~
logger() noexcept;
182 verbosity eVerbosity,
183 std::thread::
id threadId,
184 std::chrono::system_clock::time_point messageTime,
186 string_view svFunction,
188 logger_string_pool::item message);
193 virtual
void flush();
198 virtual
void reset() noexcept;
215 verbosity eVerbosity,
216 std::thread::
id threadId,
217 std::chrono::system_clock::time_point messageTime,
219 string_view svFunction,
220 int nLine) const noexcept;
223 logger_string_pool* _get_string_pool() noexcept;
226 QX_PERF_SHARED_MUTEX(m_StreamsMutex);
227 std::vector<logger_sbo> m_Streams;
229 QX_PERF_SHARED_MUTEX(m_RegisteredCategoriesMutex);
230 category_data_map m_RegisteredCategories;
232 logger_string_pool m_StringsPool;
234 std::atomic<format_function_pointer> m_DefaultFormatFunction = format_message_qx;
235 static_assert(std::atomic<format_function_pointer>::is_always_lock_free);
261 inline logger* g_pGlobalLogger =
nullptr;
269 return g_pGlobalLogger ? *g_pGlobalLogger : logger_singleton::get_instance().get_logger();
276 #define _QX_LOG_C(verbosityCheckKeyword, category, eVerbosity, ...) \
279 verbosityCheckKeyword const auto& _category = category; \
280 if verbosityCheckKeyword (eVerbosity >= _category.get_verbosity()) \
282 qx::logger& _logger = qx::get_logger(); \
286 std::this_thread::get_id(), \
287 std::chrono::system_clock::now(), \
289 qx::convert_string_literal<qx::char_type, __FUNCTION__>(), \
291 _QX_MACRO_USER_MESSAGE(_logger._get_string_pool(), __VA_ARGS__)); \
Base class for logger streams.
A category is a class that identifies a particular piece of code. This code can be located in differe...
Wrapper for enumerations to be used as a list of flags.
virtual void log(const category &category, verbosity eVerbosity, std::thread::id threadId, std::chrono::system_clock::time_point messageTime, string_view svFile, string_view svFunction, int nLine, logger_string_pool::item message)
Log to all streams.
size_t remove_streams() noexcept
Remove all the streams of the given type.
auto get_streams() noexcept
Get all the streams of the given type.
flags< message_necessity_type > get_message_necessity_type(const category &category, verbosity eVerbosity, std::thread::id threadId, std::chrono::system_clock::time_point messageTime, string_view svFile, string_view svFunction, int nLine) const noexcept
Check if this message will go somewhere.
void add_stream(stream_t stream) noexcept
Add an output stream to the logger.
void register_category(const category &category, category_data data) noexcept
Add custom rules for category.
std::shared_mutex & get_streams_mutex() noexcept
Get streams mutex.
stream_t * get_stream() noexcept
Get the first occurrence of a stream of the given type.
virtual void reset() noexcept
Reset logger and clear all streams.
void set_default_formatter(format_function_pointer pFormatter) noexcept
Set a function that will be used as the default formatter in case no formatter found in categories re...
virtual void flush()
Flush all streams.
Small Buffer Object for polymorphic classes.
Fixed-size atomic string pool.
Inherit the necessary singleton class from this.
#define QX_FLAGS_ENUM_CLASS(enumName)
Define to let to use this enum class in different binary operations returning qx::flags.
logger & get_logger() noexcept
Get the logger instance used in QX_LOG macros.