diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2018-07-11 07:33:08 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2018-07-11 07:33:08 +0200 |
commit | 621f4acf1406e51eaf5d9429c46625e6f5fde98e (patch) | |
tree | 0fe1fd92a0502602f54b2bf12a8c247ef575d00f /lib/spdlog/details/async_logger_impl.h | |
parent | 25d4e8d5ee396a852568b7ae1c15971a9da409db (diff) | |
parent | 5aa4b715375b173e9c24363f977883786b05cd6d (diff) |
Merge branch 'release/debian/2.0.0-1'debian/2.0.0-1
Diffstat (limited to 'lib/spdlog/details/async_logger_impl.h')
-rw-r--r-- | lib/spdlog/details/async_logger_impl.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/lib/spdlog/details/async_logger_impl.h b/lib/spdlog/details/async_logger_impl.h new file mode 100644 index 0000000..33ab4b9 --- /dev/null +++ b/lib/spdlog/details/async_logger_impl.h @@ -0,0 +1,95 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +// Async Logger implementation +// Use an async_sink (queue per logger) to perform the logging in a worker thread + +#include "../async_logger.h" +#include "../details/async_log_helper.h" + +#include <chrono> +#include <functional> +#include <memory> +#include <string> + +template<class It> +inline spdlog::async_logger::async_logger(const std::string &logger_name, const It &begin, const It &end, size_t queue_size, + const async_overflow_policy overflow_policy, const std::function<void()> &worker_warmup_cb, + const std::chrono::milliseconds &flush_interval_ms, const std::function<void()> &worker_teardown_cb) + : logger(logger_name, begin, end) + , _async_log_helper(new details::async_log_helper(logger_name, _formatter, _sinks, queue_size, _err_handler, overflow_policy, + worker_warmup_cb, flush_interval_ms, worker_teardown_cb)) +{ +} + +inline spdlog::async_logger::async_logger(const std::string &logger_name, sinks_init_list sinks_list, size_t queue_size, + const async_overflow_policy overflow_policy, const std::function<void()> &worker_warmup_cb, + const std::chrono::milliseconds &flush_interval_ms, const std::function<void()> &worker_teardown_cb) + : async_logger(logger_name, sinks_list.begin(), sinks_list.end(), queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, + worker_teardown_cb) +{ +} + +inline spdlog::async_logger::async_logger(const std::string &logger_name, sink_ptr single_sink, size_t queue_size, + const async_overflow_policy overflow_policy, const std::function<void()> &worker_warmup_cb, + const std::chrono::milliseconds &flush_interval_ms, const std::function<void()> &worker_teardown_cb) + : async_logger( + logger_name, {std::move(single_sink)}, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb) +{ +} + +inline void spdlog::async_logger::flush() +{ + _async_log_helper->flush(); +} + +// Error handler +inline void spdlog::async_logger::set_error_handler(spdlog::log_err_handler err_handler) +{ + _err_handler = err_handler; + _async_log_helper->set_error_handler(err_handler); +} +inline spdlog::log_err_handler spdlog::async_logger::error_handler() +{ + return _err_handler; +} + +inline void spdlog::async_logger::_set_formatter(spdlog::formatter_ptr msg_formatter) +{ + _formatter = msg_formatter; + _async_log_helper->set_formatter(_formatter); +} + +inline void spdlog::async_logger::_set_pattern(const std::string &pattern, pattern_time_type pattern_time) +{ + _formatter = std::make_shared<pattern_formatter>(pattern, pattern_time); + _async_log_helper->set_formatter(_formatter); +} + +inline void spdlog::async_logger::_sink_it(details::log_msg &msg) +{ + try + { +#if defined(SPDLOG_ENABLE_MESSAGE_COUNTER) + _incr_msg_counter(msg); +#endif + _async_log_helper->log(msg); + if (_should_flush_on(msg)) + { + _async_log_helper->flush(); // do async flush + } + } + catch (const std::exception &ex) + { + _err_handler(ex.what()); + } + catch (...) + { + _err_handler("Unknown exception in logger " + _name); + throw; + } +} |