2016-09-02 22:06:00 +08:00
|
|
|
//
|
|
|
|
// 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 <spdlog/details/async_log_helper.h>
|
|
|
|
#include <spdlog/async_logger.h>
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
#include <functional>
|
|
|
|
#include <chrono>
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
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(_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,
|
2016-09-30 19:08:31 +08:00
|
|
|
sinks_init_list sinks_list,
|
2016-09-02 22:06:00 +08:00
|
|
|
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) :
|
2016-09-30 19:08:31 +08:00
|
|
|
async_logger(logger_name, sinks_list.begin(), sinks_list.end(), queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb) {}
|
2016-09-02 22:06:00 +08:00
|
|
|
|
|
|
|
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,
|
|
|
|
{
|
|
|
|
single_sink
|
|
|
|
}, queue_size, overflow_policy, worker_warmup_cb, flush_interval_ms, worker_teardown_cb) {}
|
|
|
|
|
|
|
|
|
|
|
|
inline void spdlog::async_logger::flush()
|
|
|
|
{
|
2016-09-03 06:35:10 +08:00
|
|
|
_async_log_helper->flush(true);
|
2016-09-02 22:06:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
_formatter = std::make_shared<pattern_formatter>(pattern);
|
|
|
|
_async_log_helper->set_formatter(_formatter);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
inline void spdlog::async_logger::_sink_it(details::log_msg& msg)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
_async_log_helper->log(msg);
|
|
|
|
if (_should_flush_on(msg))
|
2016-09-03 06:35:10 +08:00
|
|
|
_async_log_helper->flush(false); // do async flush
|
2016-09-02 22:06:00 +08:00
|
|
|
}
|
|
|
|
catch (const std::exception &ex)
|
|
|
|
{
|
|
|
|
_err_handler(ex.what());
|
|
|
|
}
|
|
|
|
catch (...)
|
|
|
|
{
|
|
|
|
_err_handler("Unknown exception");
|
|
|
|
}
|
|
|
|
}
|