From 20cd4462b35bb399a54139b295a444ae38c6fd1a Mon Sep 17 00:00:00 2001 From: gabime Date: Sat, 23 Nov 2024 16:50:47 +0200 Subject: [PATCH] More fixes relating to removal of factory and registry --- bench/latency.cpp | 114 +++++++++++++++-------------- changes | 5 +- example/example.cpp | 92 ++++++++++------------- include/spdlog/async.h | 87 ---------------------- include/spdlog/async_logger.h | 1 + include/spdlog/sinks/syslog_sink.h | 41 +++++------ include/spdlog/sinks/udp_sink.h | 11 --- src/async.cpp | 1 - src/color_sinks.cpp | 2 - src/stdout_sinks.cpp | 1 - 10 files changed, 122 insertions(+), 233 deletions(-) delete mode 100644 include/spdlog/async.h diff --git a/bench/latency.cpp b/bench/latency.cpp index 1999317a..229b9e04 100644 --- a/bench/latency.cpp +++ b/bench/latency.cpp @@ -10,7 +10,7 @@ #include "benchmark/benchmark.h" #include "spdlog/spdlog.h" -#include "spdlog/async.h" +#include "spdlog/async_logger.h" #include "spdlog/sinks/basic_file_sink.h" #include "spdlog/sinks/daily_file_sink.h" #include "spdlog/sinks/null_sink.h" @@ -69,15 +69,15 @@ void bench_disabled_macro_global_logger(benchmark::State &state, #ifdef __linux__ void bench_dev_null() { - auto dev_null_st = spdlog::basic_logger_st("/dev/null_st", "/dev/null"); - benchmark::RegisterBenchmark("/dev/null_st", bench_logger, std::move(dev_null_st)) + auto sink_st = std::make_shared("/dev/null"); + auto dev_null_st = std::make_shared("/dev/null_st", std::move(sink_st)); + RegisterBenchmark("/dev/null_st", bench_logger, std::move(dev_null_st)) ->UseRealTime(); - spdlog::drop("/dev/null_st"); - auto dev_null_mt = spdlog::basic_logger_mt("/dev/null_mt", "/dev/null"); - benchmark::RegisterBenchmark("/dev/null_mt", bench_logger, std::move(dev_null_mt)) + auto sink_mt = std::make_shared("/dev/null"); + auto dev_null_mt = std::make_shared("/dev/null_mt", std::move(sink_mt)); + RegisterBenchmark("/dev/null_mt", bench_logger, std::move(dev_null_mt)) ->UseRealTime(); - spdlog::drop("/dev/null_mt"); } #endif // __linux__ @@ -95,31 +95,31 @@ int main(int argc, char *argv[]) { auto disabled_logger = std::make_shared("bench", std::make_shared()); disabled_logger->set_level(spdlog::level::off); - benchmark::RegisterBenchmark("disabled-at-compile-time", bench_disabled_macro, disabled_logger); - benchmark::RegisterBenchmark("disabled-at-compile-time (global logger)", + RegisterBenchmark("disabled-at-compile-time", bench_disabled_macro, disabled_logger); + RegisterBenchmark("disabled-at-compile-time (global logger)", bench_disabled_macro_global_logger, disabled_logger); - benchmark::RegisterBenchmark("disabled-at-runtime", bench_logger, disabled_logger); - benchmark::RegisterBenchmark("disabled-at-runtime (global logger)", bench_global_logger, + RegisterBenchmark("disabled-at-runtime", bench_logger, disabled_logger); + RegisterBenchmark("disabled-at-runtime (global logger)", bench_global_logger, disabled_logger); // with backtrace of 64 auto tracing_disabled_logger = std::make_shared("bench", std::make_shared()); tracing_disabled_logger->enable_backtrace(64); - benchmark::RegisterBenchmark("disabled-at-runtime/backtrace", bench_logger, + RegisterBenchmark("disabled-at-runtime/backtrace", bench_logger, tracing_disabled_logger); auto null_logger_st = std::make_shared("bench", std::make_shared()); - benchmark::RegisterBenchmark("null_sink_st (500_bytes c_str)", bench_c_string, + RegisterBenchmark("null_sink_st (500_bytes c_str)", bench_c_string, std::move(null_logger_st)); - benchmark::RegisterBenchmark("null_sink_st", bench_logger, null_logger_st); - benchmark::RegisterBenchmark("null_sink_st (global logger)", bench_global_logger, + RegisterBenchmark("null_sink_st", bench_logger, null_logger_st); + RegisterBenchmark("null_sink_st (global logger)", bench_global_logger, null_logger_st); // with backtrace of 64 auto tracing_null_logger_st = std::make_shared("bench", std::make_shared()); tracing_null_logger_st->enable_backtrace(64); - benchmark::RegisterBenchmark("null_sink_st/backtrace", bench_logger, tracing_null_logger_st); + RegisterBenchmark("null_sink_st/backtrace", bench_logger, tracing_null_logger_st); #ifdef __linux__ bench_dev_null(); @@ -127,74 +127,82 @@ int main(int argc, char *argv[]) { if (full_bench) { // basic_st - auto basic_st = spdlog::basic_logger_st("basic_st", "latency_logs/basic_st.log", true); - benchmark::RegisterBenchmark("basic_st", bench_logger, std::move(basic_st))->UseRealTime(); - spdlog::drop("basic_st"); + auto sink = + std::make_shared("latency_logs/basic_st.log", true); + auto basic_st = std::make_shared("basic_st", std::move(sink)); + RegisterBenchmark("basic_st", bench_logger, std::move(basic_st))->UseRealTime(); // with backtrace of 64 + + auto sink2 = std::make_shared( + "latency_logs/tracing_basic_st.log", true); auto tracing_basic_st = - spdlog::basic_logger_st("tracing_basic_st", "latency_logs/tracing_basic_st.log", true); + std::make_shared("tracing_basic_st", std::move(sink2)); tracing_basic_st->enable_backtrace(64); - benchmark::RegisterBenchmark("basic_st/backtrace", bench_logger, + RegisterBenchmark("basic_st/backtrace", bench_logger, std::move(tracing_basic_st)) ->UseRealTime(); - spdlog::drop("tracing_basic_st"); // rotating st - auto rotating_st = spdlog::rotating_logger_st("rotating_st", "latency_logs/rotating_st.log", - file_size, rotating_files); - benchmark::RegisterBenchmark("rotating_st", bench_logger, std::move(rotating_st)) + auto sink3 = std::make_shared( + "latency_logs/rotating_st.log", file_size, rotating_files); + auto rotating_st = std::make_shared("rotate_st", std::move(sink3)); + RegisterBenchmark("rotating_st", bench_logger, std::move(rotating_st)) ->UseRealTime(); - spdlog::drop("rotating_st"); // with backtrace of 64 - auto tracing_rotating_st = spdlog::rotating_logger_st( - "tracing_rotating_st", "latency_logs/tracing_rotating_st.log", file_size, - rotating_files); - benchmark::RegisterBenchmark("rotating_st/backtrace", bench_logger, - std::move(tracing_rotating_st)) - ->UseRealTime(); - spdlog::drop("tracing_rotating_st"); + auto sink4 = std::make_shared( + "latency_logs/tracing_rotating_st.log", file_size, rotating_files); + + auto tracing_rotating_st = + std::make_shared("tracing_rotating_st", std::move(sink4)); + RegisterBenchmark("rotating_st/backtrace", bench_logger, std::move(tracing_rotating_st))->UseRealTime(); // daily st - auto daily_st = spdlog::daily_logger_mt("daily_st", "latency_logs/daily_st.log"); - benchmark::RegisterBenchmark("daily_st", bench_logger, std::move(daily_st))->UseRealTime(); - spdlog::drop("daily_st"); + auto sink5 = + std::make_shared("latency_logs/daily_st.log", 1, 0); + auto daily_st = std::make_shared("daily_st", std::move(sink5)); + RegisterBenchmark("daily_st", bench_logger, std::move(daily_st))->UseRealTime(); + + auto sink6 = std::make_shared("latency_logs/tracing_daily_st.log", 1, 0); auto tracing_daily_st = - spdlog::daily_logger_mt("tracing_daily_st", "latency_logs/daily_st.log"); - benchmark::RegisterBenchmark("daily_st/backtrace", bench_logger, + std::make_shared("logger", std::move(sink6)); + RegisterBenchmark("daily_st/backtrace", bench_logger, std::move(tracing_daily_st)) ->UseRealTime(); - spdlog::drop("tracing_daily_st"); // // Multi threaded bench, 10 loggers using same logger concurrently // auto null_logger_mt = - std::make_shared("bench", std::make_shared()); - benchmark::RegisterBenchmark("null_sink_mt", bench_logger, null_logger_mt) + std::make_shared("logger", std::make_shared()); + RegisterBenchmark("null_sink_mt", bench_logger, null_logger_mt) ->Threads(n_threads) ->UseRealTime(); // basic_mt - auto basic_mt = spdlog::basic_logger_mt("basic_mt", "latency_logs/basic_mt.log", true); - benchmark::RegisterBenchmark("basic_mt", bench_logger, std::move(basic_mt)) + auto sink7 = + std::make_shared("latency_logs/basic_mt.log", true); + auto basic_mt = std::make_shared("logger", std::move(sink7)); + RegisterBenchmark("basic_mt", bench_logger, std::move(basic_mt)) ->Threads(n_threads) ->UseRealTime(); - spdlog::drop("basic_mt"); // rotating mt - auto rotating_mt = spdlog::rotating_logger_mt("rotating_mt", "latency_logs/rotating_mt.log", - file_size, rotating_files); - benchmark::RegisterBenchmark("rotating_mt", bench_logger, std::move(rotating_mt)) + auto sink8 = std::make_shared( + "latency_logs/rotating_mt.log", file_size, rotating_files); + + auto rotating_mt = std::make_shared("logger", std::move(sink8)); + + RegisterBenchmark("rotating_mt", bench_logger, std::move(rotating_mt)) ->Threads(n_threads) ->UseRealTime(); - spdlog::drop("rotating_mt"); // daily mt - auto daily_mt = spdlog::daily_logger_mt("daily_mt", "latency_logs/daily_mt.log"); - benchmark::RegisterBenchmark("daily_mt", bench_logger, std::move(daily_mt)) + auto sink9 = + std::make_shared("latency_logs/daily_mt.log",1,0); + auto daily_mt = std::make_shared("logger", std::move(sink9)); + RegisterBenchmark("daily_mt", bench_logger, std::move(daily_mt)) ->Threads(n_threads) ->UseRealTime(); - spdlog::drop("daily_mt"); } // async @@ -203,7 +211,7 @@ int main(int argc, char *argv[]) { auto async_logger = std::make_shared( "async_logger", std::make_shared(), std::move(tp), spdlog::async_overflow_policy::overrun_oldest); - benchmark::RegisterBenchmark("async_logger", bench_logger, async_logger) + RegisterBenchmark("async_logger", bench_logger, async_logger) ->Threads(n_threads) ->UseRealTime(); @@ -211,7 +219,7 @@ int main(int argc, char *argv[]) { "async_logger_tracing", std::make_shared(), std::move(tp), spdlog::async_overflow_policy::overrun_oldest); async_logger_tracing->enable_backtrace(32); - benchmark::RegisterBenchmark("async_logger/tracing", bench_logger, async_logger_tracing) + RegisterBenchmark("async_logger/tracing", bench_logger, async_logger_tracing) ->Threads(n_threads) ->UseRealTime(); diff --git a/changes b/changes index f3417e7d..f6ba2fd1 100644 --- a/changes +++ b/changes @@ -4,8 +4,9 @@ Removed registry api Removed spdlog/cfg/* api (?) Renamed set/get_default_logger() to set/get_logger() Removed all factory functions. Use the logger constructor instead. +Removed flush_every TODO - Thread pool singleton and clean async.h -flush_every removed() ? +remove periodic worker files + diff --git a/example/example.cpp b/example/example.cpp index cd9ede88..ce955bb8 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -28,12 +28,11 @@ void file_events_example(); void replace_default_logger_example(); #include "spdlog/spdlog.h" -#include "spdlog/cfg/env.h" // support for loading levels from the environment variable #include "spdlog/fmt/ostr.h" // support for user defined types int main(int, char *[]) { // Log levels can be loaded from argv/env using "SPDLOG_LEVEL" - //load_levels_example(); + // load_levels_example(); spdlog::info("Welcome to spdlog version {}.{}.{} !", SPDLOG_VER_MAJOR, SPDLOG_VER_MINOR, SPDLOG_VER_PATCH); @@ -85,14 +84,7 @@ int main(int, char *[]) { file_events_example(); replace_default_logger_example(); - // Flush all *registered* loggers using a worker thread every 3 seconds. - // note: registered loggers *must* be thread safe for this to work correctly! - spdlog::flush_every(std::chrono::seconds(3)); - - // Apply some function on all registered loggers - spdlog::apply_all([&](std::shared_ptr l) { l->info("End of example."); }); - - // Release all spdlog resources, and drop all loggers in the registry. + // Release the default logger // This is optional (only mandatory if using windows + async log). spdlog::shutdown(); } @@ -108,63 +100,50 @@ int main(int, char *[]) { // or #include "spdlog/sinks/stdout_sinks.h" if no colors needed. void stdout_logger_example() { // Create color multi threaded logger. - auto console = spdlog::stdout_color_mt("console"); + auto sink = std::make_shared(); // or for stderr: - // auto console = spdlog::stderr_color_mt("error-logger"); + // auto sink = std::make_shared(); + spdlog::logger logger("console", std::move(sink)); } #include "spdlog/sinks/basic_file_sink.h" void basic_example() { // Create basic file logger (not rotated). - auto my_logger = spdlog::basic_logger_mt("file_logger", "logs/basic-log.txt", true); + auto sink = std::make_shared("logs/basic-log.txt", true); + spdlog::logger logger("basic_logger", std::move(sink)); } #include "spdlog/sinks/rotating_file_sink.h" void rotating_example() { // Create a file rotating logger with 5mb size max and 3 rotated files. - auto rotating_logger = - spdlog::rotating_logger_mt("some_logger_name", "logs/rotating.txt", 1048576 * 5, 3); + auto sink = + std::make_shared("logs/rotating.txt", 1048576 * 5, 3); + spdlog::logger logger("rotating_logger", std::move(sink)); } #include "spdlog/sinks/daily_file_sink.h" void daily_example() { // Create a daily logger - a new file is created every day on 2:30am. - auto daily_logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 2, 30); + auto sink = std::make_shared("logs/daily.txt", 2, 30); + spdlog::logger logger("daily_logger", std::move(sink)); } #include "spdlog/sinks/callback_sink.h" void callback_example() { // Create the logger - auto logger = spdlog::callback_logger_mt("custom_callback_logger", - [](const spdlog::details::log_msg & /*msg*/) { - // do what you need to do with msg - }); + auto sink = std::make_shared( + [](const spdlog::details::log_msg & /*msg*/) { /* do something with the message */ }); + spdlog::logger logger("callback_logger", std::move(sink)); } -#include "spdlog/cfg/env.h" -void load_levels_example() { - // Set the log level to "info" and mylogger to "trace": - // SPDLOG_LEVEL=info,mylogger=trace && ./example - spdlog::cfg::load_env_levels(); - // or from command line: - // ./example SPDLOG_LEVEL=info,mylogger=trace - // #include "spdlog/cfg/argv.h" // for loading levels from argv - // spdlog::cfg::load_argv_levels(args, argv); -} - -#include "spdlog/async.h" +#include "spdlog/async_logger.h" void async_example() { - // Default thread pool settings can be modified *before* creating the async logger: - // spdlog::init_thread_pool(32768, 1); // queue with max 32k items 1 backing thread. - auto async_file = - spdlog::basic_logger_mt("async_file_logger", "logs/async_log.txt"); - // alternatively: - // auto async_file = - // spdlog::create_async("async_file_logger", - // "logs/async_log.txt"); - + auto tp = std::make_shared(32768, 1); + auto sink = std::make_shared("logs/async_log.txt"); + auto logger = std::make_shared( + "async_file_logger", std::move(sink), std::move(tp), spdlog::async_overflow_policy::block); for (int i = 1; i < 101; ++i) { - async_file->info("Async message #{}", i); + logger->info("Async message #{}", i); } } @@ -222,9 +201,9 @@ void trace_example() { // debug from default logger SPDLOG_DEBUG("Some debug message.. {} ,{}", 1, 3.23); - // trace from logger object - auto logger = spdlog::get("file_logger"); - SPDLOG_LOGGER_TRACE(logger, "another trace message"); + // trace from named logger + spdlog::logger some_logger("some_logger"); + SPDLOG_LOGGER_TRACE(some_logger, "another trace message"); } // stopwatch example @@ -239,9 +218,10 @@ void stopwatch_example() { #include "spdlog/sinks/udp_sink.h" void udp_example() { spdlog::sinks::udp_sink_config cfg("127.0.0.1", 11091); - auto my_logger = spdlog::udp_logger_mt("udplog", cfg); - my_logger->set_level(spdlog::level::debug); - my_logger->info("hello world"); + auto sink = std::make_shared(cfg); + spdlog::logger logger("udp_logger", std::move(sink)); + logger.set_level(spdlog::level::debug); + logger.info("hello world"); } // A logger with multiple sinks (stdout and file) - each with a different format and log level. @@ -264,7 +244,7 @@ void multi_sink_example() { struct my_type { int i = 0; explicit my_type(int i) - : i(i){} + : i(i) {} }; #ifndef SPDLOG_USE_STD_FORMAT // when using fmtlib @@ -299,8 +279,12 @@ void err_handler_example() { #include "spdlog/sinks/syslog_sink.h" void syslog_example() { std::string ident = "spdlog-example"; - auto syslog_logger = spdlog::syslog_logger_mt("syslog", ident, LOG_PID); - syslog_logger->warn("This is warning that will end up in syslog."); + int syslog_option = 0; + int syslog_facility = LOG_USER; + bool enable_formatting = false; + auto sink = std::make_shared(ident, syslog_option, + syslog_facility, enable_formatting); + spdlog::logger logger("syslog_logger", std::move(sink)); } #endif @@ -365,14 +349,12 @@ void file_events_example() { void replace_default_logger_example() { // store the old logger so we don't break other examples. auto old_logger = spdlog::default_logger(); - - auto new_logger = - spdlog::basic_logger_mt("new_default_logger", "logs/new-default-log.txt", true); + auto new_logger = std::make_shared("new_default_logger"); spdlog::set_default_logger(new_logger); spdlog::set_level(spdlog::level::info); spdlog::debug("This message should not be displayed!"); spdlog::set_level(spdlog::level::trace); spdlog::debug("This message should be displayed.."); - + // restore the prev logger spdlog::set_default_logger(old_logger); } \ No newline at end of file diff --git a/include/spdlog/async.h b/include/spdlog/async.h deleted file mode 100644 index ae99c0fe..00000000 --- a/include/spdlog/async.h +++ /dev/null @@ -1,87 +0,0 @@ -// // Copyright(c) 2015-present, Gabi Melman & spdlog contributors. -// // Distributed under the MIT License (http://opensource.org/licenses/MIT) -// -// #pragma once -// -// // -// // Async logging using global thread pool -// // All loggers created here share same global thread pool. -// // Each log message is pushed to a queue along with a shared pointer to the -// // logger. -// // If a logger deleted while having pending messages in the queue, it's actual -// // destruction will defer -// // until all its messages are processed by the thread pool. -// // This is because each message in the queue holds a shared_ptr to the -// // originating logger. -// -// #include -// #include -// -// #include -// #include -// #include -// -// namespace spdlog { -// -// namespace details { -// static const size_t default_async_q_size = 8192; -// } -// -// // async logger factory - creates async loggers backed with thread pool. -// // if a global thread pool doesn't already exist, create it with default queue -// // size of 8192 items and single thread. -// template -// struct async_factory_impl { -// template -// static std::shared_ptr create(std::string logger_name, SinkArgs &&...args) { -// auto tp = std::make_shared(details::default_async_q_size, 1U); -// auto sink = std::make_shared(std::forward(args)...); -// auto new_logger = std::make_shared(std::move(logger_name), std::move(sink), -// std::move(tp), OverflowPolicy); -// return new_logger; -// } -// }; -// -// using async_factory = async_factory_impl; -// using async_factory_nonblock = async_factory_impl; -// -// template -// inline std::shared_ptr create_async(std::string logger_name, -// SinkArgs &&...sink_args) { -// return async_factory::create(std::move(logger_name), -// std::forward(sink_args)...); -// } -// -// template -// inline std::shared_ptr create_async_nb(std::string logger_name, -// SinkArgs &&...sink_args) { -// return async_factory_nonblock::create(std::move(logger_name), -// std::forward(sink_args)...); -// } -// -// // // set global thread pool. -// // inline void init_thread_pool(size_t q_size, -// // size_t thread_count, -// // std::function on_thread_start, -// // std::function on_thread_stop) { -// // auto tp = std::make_shared(q_size, thread_count, on_thread_start, -// // on_thread_stop); -// // details::registry::instance().set_tp(std::move(tp)); -// // } -// // -// // inline void init_thread_pool(size_t q_size, -// // size_t thread_count, -// // std::function on_thread_start) { -// // init_thread_pool(q_size, thread_count, on_thread_start, [] {}); -// // } -// // -// // inline void init_thread_pool(size_t q_size, size_t thread_count) { -// // init_thread_pool( -// // q_size, thread_count, [] {}, [] {}); -// // } -// -// // get the global thread pool. -// // inline std::shared_ptr thread_pool() { -// // return details::registry::instance().get_tp(); -// // } -// } // namespace spdlog diff --git a/include/spdlog/async_logger.h b/include/spdlog/async_logger.h index 846c4c6f..9982eeab 100644 --- a/include/spdlog/async_logger.h +++ b/include/spdlog/async_logger.h @@ -15,6 +15,7 @@ // destructing.. #include +#include namespace spdlog { diff --git a/include/spdlog/sinks/syslog_sink.h b/include/spdlog/sinks/syslog_sink.h index 913d41be..52ff1864 100644 --- a/include/spdlog/sinks/syslog_sink.h +++ b/include/spdlog/sinks/syslog_sink.h @@ -4,7 +4,6 @@ #pragma once #include -#include #include #include @@ -81,24 +80,24 @@ using syslog_sink_mt = syslog_sink; using syslog_sink_st = syslog_sink; } // namespace sinks -// Create and register a syslog logger -template -inline std::shared_ptr syslog_logger_mt(const std::string &logger_name, - const std::string &syslog_ident = "", - int syslog_option = 0, - int syslog_facility = LOG_USER, - bool enable_formatting = false) { - return Factory::template create(logger_name, syslog_ident, syslog_option, - syslog_facility, enable_formatting); -} - -template -inline std::shared_ptr syslog_logger_st(const std::string &logger_name, - const std::string &syslog_ident = "", - int syslog_option = 0, - int syslog_facility = LOG_USER, - bool enable_formatting = false) { - return Factory::template create(logger_name, syslog_ident, syslog_option, - syslog_facility, enable_formatting); -} +// // Create and register a syslog logger +// template +// inline std::shared_ptr syslog_logger_mt(const std::string &logger_name, +// const std::string &syslog_ident = "", +// int syslog_option = 0, +// int syslog_facility = LOG_USER, +// bool enable_formatting = false) { +// return Factory::template create(logger_name, syslog_ident, syslog_option, +// syslog_facility, enable_formatting); +// } +// +// template +// inline std::shared_ptr syslog_logger_st(const std::string &logger_name, +// const std::string &syslog_ident = "", +// int syslog_option = 0, +// int syslog_facility = LOG_USER, +// bool enable_formatting = false) { +// return Factory::template create(logger_name, syslog_ident, syslog_option, +// syslog_facility, enable_formatting); +//} } // namespace spdlog diff --git a/include/spdlog/sinks/udp_sink.h b/include/spdlog/sinks/udp_sink.h index 4bff0fd2..8ff9fa8e 100644 --- a/include/spdlog/sinks/udp_sink.h +++ b/include/spdlog/sinks/udp_sink.h @@ -54,16 +54,5 @@ protected: using udp_sink_mt = udp_sink; using udp_sink_st = udp_sink; - } // namespace sinks - -// -// factory functions -// -template -inline std::shared_ptr udp_logger_mt(const std::string &logger_name, - sinks::udp_sink_config skin_config) { - return Factory::template create(logger_name, skin_config); -} - } // namespace spdlog diff --git a/src/async.cpp b/src/async.cpp index 026185ac..16c959bf 100644 --- a/src/async.cpp +++ b/src/async.cpp @@ -5,7 +5,6 @@ #error Please define SPDLOG_COMPILED_LIB to compile this file. #endif -#include #include #include #include diff --git a/src/color_sinks.cpp b/src/color_sinks.cpp index 2225a80b..2abbec02 100644 --- a/src/color_sinks.cpp +++ b/src/color_sinks.cpp @@ -6,8 +6,6 @@ #endif #include - -#include #include // // color sinks diff --git a/src/stdout_sinks.cpp b/src/stdout_sinks.cpp index 0020beb8..1343551f 100644 --- a/src/stdout_sinks.cpp +++ b/src/stdout_sinks.cpp @@ -7,7 +7,6 @@ #include -#include #include #include