added level_t to sink. Improves the flexibility of loggers with multiple sinks
This commit is contained in:
		@@ -40,6 +40,9 @@ target_link_libraries(example spdlog::spdlog ${CMAKE_THREAD_LIBS_INIT})
 | 
			
		||||
add_executable(benchmark bench.cpp)
 | 
			
		||||
target_link_libraries(benchmark spdlog::spdlog ${CMAKE_THREAD_LIBS_INIT})
 | 
			
		||||
 | 
			
		||||
add_executable(multisink multisink.cpp)
 | 
			
		||||
target_link_libraries(multisink spdlog::spdlog ${CMAKE_THREAD_LIBS_INIT})
 | 
			
		||||
 | 
			
		||||
enable_testing()
 | 
			
		||||
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/logs")
 | 
			
		||||
add_test(NAME RunExample COMMAND example)
 | 
			
		||||
 
 | 
			
		||||
@@ -303,8 +303,11 @@ inline bool spdlog::details::async_log_helper::process_next_msg(log_clock::time_
 | 
			
		||||
            log_msg incoming_log_msg;
 | 
			
		||||
            incoming_async_msg.fill_log_msg(incoming_log_msg);
 | 
			
		||||
            _formatter->format(incoming_log_msg);
 | 
			
		||||
            for (auto &s : _sinks)
 | 
			
		||||
                s->log(incoming_log_msg);
 | 
			
		||||
            for (auto &s : _sinks){
 | 
			
		||||
                if(s->should_log( incoming_log_msg.level)){
 | 
			
		||||
                    s->log(incoming_log_msg);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
@@ -317,7 +320,6 @@ inline bool spdlog::details::async_log_helper::process_next_msg(log_clock::time_
 | 
			
		||||
        handle_flush_interval(now, last_flush);
 | 
			
		||||
        sleep_or_yield(now, last_pop);
 | 
			
		||||
        return !_terminate_requested;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -245,8 +245,11 @@ inline bool spdlog::logger::should_log(spdlog::level::level_enum msg_level) cons
 | 
			
		||||
inline void spdlog::logger::_sink_it(details::log_msg& msg)
 | 
			
		||||
{
 | 
			
		||||
    _formatter->format(msg);
 | 
			
		||||
    for (auto &sink : _sinks)
 | 
			
		||||
        sink->log(msg);
 | 
			
		||||
    for (auto &sink : _sinks){
 | 
			
		||||
        if( sink->should_log( msg.level)){
 | 
			
		||||
            sink->log(msg);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(_should_flush_on(msg))
 | 
			
		||||
        flush();
 | 
			
		||||
 
 | 
			
		||||
@@ -35,11 +35,13 @@ protected:
 | 
			
		||||
 | 
			
		||||
    void _sink_it(const details::log_msg& msg) override
 | 
			
		||||
    {
 | 
			
		||||
        for (auto &sink : _sinks)
 | 
			
		||||
            sink->log(msg);
 | 
			
		||||
        for (auto &sink : _sinks){
 | 
			
		||||
            if( sink->should_log( msg.level)){
 | 
			
		||||
                sink->log(msg);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    void flush() override
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,10 +15,33 @@ namespace sinks
 | 
			
		||||
class sink
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    sink(): _level( level::trace ) {}
 | 
			
		||||
 | 
			
		||||
    virtual ~sink() {}
 | 
			
		||||
    virtual void log(const details::log_msg& msg) = 0;
 | 
			
		||||
    virtual void flush() = 0;
 | 
			
		||||
 | 
			
		||||
    bool should_log(level::level_enum msg_level) const;
 | 
			
		||||
    void set_level(level::level_enum log_level);
 | 
			
		||||
    level::level_enum level() const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    level_t _level;
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline bool sink::should_log(level::level_enum msg_level) const {
 | 
			
		||||
    return msg_level >= _level.load(std::memory_order_relaxed);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void sink::set_level(level::level_enum log_level) {
 | 
			
		||||
    _level.store(log_level);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline level::level_enum sink::level() const {
 | 
			
		||||
    return static_cast<spdlog::level::level_enum>(_level.load(std::memory_order_relaxed));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user