| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // This file is part of INSTINCT, the INS Toolkit for Integrated | ||
| 2 | // Navigation Concepts and Training by the Institute of Navigation of | ||
| 3 | // the University of Stuttgart, Germany. | ||
| 4 | // | ||
| 5 | // This Source Code Form is subject to the terms of the Mozilla Public | ||
| 6 | // License, v. 2.0. If a copy of the MPL was not distributed with this | ||
| 7 | // file, You can obtain one at https://mozilla.org/MPL/2.0/. | ||
| 8 | |||
| 9 | /// @file dist_filter_sink.hpp | ||
| 10 | /// @brief Distribution sink with filter option. Stores a vector of sinks which get called when log is called | ||
| 11 | /// @author T. Topp (topp@ins.uni-stuttgart.de) | ||
| 12 | /// @date 2023-03-27 | ||
| 13 | |||
| 14 | #pragma once | ||
| 15 | |||
| 16 | #include "spdlog/sinks/dist_sink.h" | ||
| 17 | #include <regex> | ||
| 18 | |||
| 19 | namespace spdlog::sinks | ||
| 20 | { | ||
| 21 | |||
| 22 | /// Distribution sink (mux) with filter option | ||
| 23 | template<typename Mutex> | ||
| 24 | class dist_filter_sink : public spdlog::sinks::dist_sink<Mutex> // NOLINT(cppcoreguidelines-virtual-class-destructor) | ||
| 25 | { | ||
| 26 | public: | ||
| 27 | /// @brief Default constructor | ||
| 28 | /// @param[in] filter Filter string | ||
| 29 | ✗ | explicit dist_filter_sink(const std::string& filter) | |
| 30 | ✗ | : filter_(filter, std::regex_constants::ECMAScript){}; | |
| 31 | /// @brief Destructor | ||
| 32 | ✗ | ~dist_filter_sink() override = default; | |
| 33 | /// @brief Copy constructor | ||
| 34 | dist_filter_sink(const dist_filter_sink&) = delete; | ||
| 35 | /// @brief Move constructor | ||
| 36 | dist_filter_sink(dist_filter_sink&&) noexcept = default; | ||
| 37 | /// @brief Copy assignment operator | ||
| 38 | dist_filter_sink& operator=(const dist_filter_sink&) = delete; | ||
| 39 | /// @brief Move assignment operator | ||
| 40 | dist_filter_sink& operator=(dist_filter_sink&&) noexcept = default; | ||
| 41 | |||
| 42 | protected: | ||
| 43 | /// String to filter messages for | ||
| 44 | std::regex filter_; | ||
| 45 | |||
| 46 | /// @brief Function called to process the log message | ||
| 47 | /// @param msg Log message struct | ||
| 48 | ✗ | void sink_it_(const spdlog::details::log_msg& msg) override | |
| 49 | { | ||
| 50 | ✗ | spdlog::memory_buf_t formatted_buf; | |
| 51 | ✗ | spdlog::sinks::base_sink<Mutex>::formatter_->format(msg, formatted_buf); | |
| 52 | ✗ | std::string formatted = fmt::to_string(formatted_buf); | |
| 53 | |||
| 54 | ✗ | if (std::regex_search(formatted, filter_)) | |
| 55 | { | ||
| 56 | ✗ | spdlog::sinks::dist_sink<Mutex>::sink_it_(msg); | |
| 57 | } | ||
| 58 | ✗ | } | |
| 59 | }; | ||
| 60 | |||
| 61 | #ifndef DOXYGEN_IGNORE | ||
| 62 | |||
| 63 | #include "spdlog/details/null_mutex.h" | ||
| 64 | #include <mutex> | ||
| 65 | using dist_filter_sink_mt = dist_filter_sink<std::mutex>; | ||
| 66 | using dist_filter_sink_st = dist_filter_sink<spdlog::details::null_mutex>; | ||
| 67 | |||
| 68 | #endif | ||
| 69 | |||
| 70 | } // namespace spdlog::sinks | ||
| 71 |