| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| // |
| // 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 "spdlog/common.h" |
| #include "spdlog/logger.h" |
| |
| #include <chrono> |
| #include <memory> |
| #include <string> |
| |
| namespace spdlog { |
| |
| // Async overflow policy - block by default. |
| enum class async_overflow_policy |
| { |
| block, // Block until message can be enqueued |
| overrun_oldest // Discard oldest message in the queue if full when trying to |
| // add new item. |
| }; |
| |
| namespace details { |
| class thread_pool; |
| } |
| |
| class async_logger final : public std::enable_shared_from_this<async_logger>, public logger |
| { |
| friend class details::thread_pool; |
| |
| public: |
| template<typename It> |
| async_logger(std::string logger_name, It begin, It end, std::weak_ptr<details::thread_pool> tp, |
| async_overflow_policy overflow_policy = async_overflow_policy::block); |
| |
| async_logger(std::string logger_name, sinks_init_list sinks_list, std::weak_ptr<details::thread_pool> tp, |
| async_overflow_policy overflow_policy = async_overflow_policy::block); |
| |
| async_logger(std::string logger_name, sink_ptr single_sink, std::weak_ptr<details::thread_pool> tp, |
| async_overflow_policy overflow_policy = async_overflow_policy::block); |
| |
| std::shared_ptr<logger> clone(std::string new_name) override; |
| |
| protected: |
| void sink_it_(details::log_msg &msg) override; |
| void flush_() override; |
| |
| void backend_log_(const details::log_msg &incoming_log_msg); |
| void backend_flush_(); |
| |
| private: |
| std::weak_ptr<details::thread_pool> thread_pool_; |
| async_overflow_policy overflow_policy_; |
| }; |
| } // namespace spdlog |
| |
| #include "details/async_logger_impl.h" |