diff options
Diffstat (limited to 'lib/spdlog/async_logger.h')
-rw-r--r-- | lib/spdlog/async_logger.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/spdlog/async_logger.h b/lib/spdlog/async_logger.h new file mode 100644 index 0000000..75641d2 --- /dev/null +++ b/lib/spdlog/async_logger.h @@ -0,0 +1,72 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// Very fast asynchronous logger (millions of logs per second on an average desktop) +// Uses pre allocated lockfree queue for maximum throughput even under large number of threads. +// Creates a single back thread to pop messages from the queue and log them. +// +// Upon each log write the logger: +// 1. Checks if its log level is enough to log the message +// 2. Push a new copy of the message to a queue (or block the caller until space is available in the queue) +// 3. will throw spdlog_ex upon log exceptions +// Upon destruction, logs all remaining messages in the queue before destructing.. + +#include "common.h" +#include "logger.h" + +#include <chrono> +#include <functional> +#include <memory> +#include <string> + +namespace spdlog { + +namespace details { +class async_log_helper; +} + +class async_logger SPDLOG_FINAL : public logger +{ +public: + template<class It> + async_logger(const std::string &logger_name, const It &begin, const It &end, size_t queue_size, + const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, + const std::function<void()> &worker_warmup_cb = nullptr, + const std::chrono::milliseconds &flush_interval_ms = std::chrono::milliseconds::zero(), + const std::function<void()> &worker_teardown_cb = nullptr); + + async_logger(const std::string &logger_name, sinks_init_list sinks, size_t queue_size, + const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, + const std::function<void()> &worker_warmup_cb = nullptr, + const std::chrono::milliseconds &flush_interval_ms = std::chrono::milliseconds::zero(), + const std::function<void()> &worker_teardown_cb = nullptr); + + async_logger(const std::string &logger_name, sink_ptr single_sink, size_t queue_size, + const async_overflow_policy overflow_policy = async_overflow_policy::block_retry, + const std::function<void()> &worker_warmup_cb = nullptr, + const std::chrono::milliseconds &flush_interval_ms = std::chrono::milliseconds::zero(), + const std::function<void()> &worker_teardown_cb = nullptr); + + // Wait for the queue to be empty, and flush synchronously + // Warning: this can potentially last forever as we wait it to complete + void flush() override; + + // Error handler + void set_error_handler(log_err_handler) override; + log_err_handler error_handler() override; + +protected: + void _sink_it(details::log_msg &msg) override; + void _set_formatter(spdlog::formatter_ptr msg_formatter) override; + void _set_pattern(const std::string &pattern, pattern_time_type pattern_time) override; + +private: + std::unique_ptr<details::async_log_helper> _async_log_helper; +}; +} // namespace spdlog + +#include "details/async_logger_impl.h" |