From 52a01b2cf2085399a3ede5480fcd1f74c5331b42 Mon Sep 17 00:00:00 2001 From: Philip Miller Date: Thu, 6 Sep 2018 02:47:48 -0400 Subject: [PATCH 01/39] add argument to rotating file sink for rotate_on_open when true, the log file will be rotated when it is opened so the newly constructed file will start off being empty --- include/spdlog/sinks/rotating_file_sink.h | 12 +++++++----- tests/file_log.cpp | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/spdlog/sinks/rotating_file_sink.h b/include/spdlog/sinks/rotating_file_sink.h index 7ed2385a..bd6582cd 100644 --- a/include/spdlog/sinks/rotating_file_sink.h +++ b/include/spdlog/sinks/rotating_file_sink.h @@ -27,12 +27,14 @@ template class rotating_file_sink SPDLOG_FINAL : public base_sink { public: - rotating_file_sink(filename_t base_filename, std::size_t max_size, std::size_t max_files) + rotating_file_sink(filename_t base_filename, std::size_t max_size, std::size_t max_files, bool rotate_on_open=false) : base_filename_(std::move(base_filename)) , max_size_(max_size) , max_files_(max_files) { file_helper_.open(calc_filename(base_filename_, 0)); + if (rotate_on_open) + rotate_(); current_size_ = file_helper_.size(); // expensive. called only once } @@ -130,15 +132,15 @@ using rotating_file_sink_st = rotating_file_sink; template inline std::shared_ptr rotating_logger_mt( - const std::string &logger_name, const filename_t &filename, size_t max_file_size, size_t max_files) + const std::string &logger_name, const filename_t &filename, size_t max_file_size, size_t max_files, bool rotate_on_open=false) { - return Factory::template create(logger_name, filename, max_file_size, max_files); + return Factory::template create(logger_name, filename, max_file_size, max_files, rotate_on_open); } template inline std::shared_ptr rotating_logger_st( - const std::string &logger_name, const filename_t &filename, size_t max_file_size, size_t max_files) + const std::string &logger_name, const filename_t &filename, size_t max_file_size, size_t max_files, bool rotate_on_open = false) { - return Factory::template create(logger_name, filename, max_file_size, max_files); + return Factory::template create(logger_name, filename, max_file_size, max_files, rotate_on_open); } } // namespace spdlog diff --git a/tests/file_log.cpp b/tests/file_log.cpp index ace4c065..dbaab390 100644 --- a/tests/file_log.cpp +++ b/tests/file_log.cpp @@ -60,7 +60,7 @@ TEST_CASE("rotating_file_logger2", "[rotating_logger]]") prepare_logdir(); size_t max_size = 1024 * 10; std::string basename = "logs/rotating_log"; - auto logger = spdlog::rotating_logger_mt("logger", basename, max_size, 1); + auto logger = spdlog::rotating_logger_mt("logger", basename, max_size, 1, true); for (int i = 0; i < 10; ++i) logger->info("Test message {}", i); From a7148b718ea2fabb8387cb90aee9bf448da63e65 Mon Sep 17 00:00:00 2001 From: gabime Date: Fri, 18 Jan 2019 12:13:07 +0200 Subject: [PATCH 02/39] Version 1.3.1 --- CMakeLists.txt | 2 +- include/spdlog/version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e1d96563..cf2d04f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # cmake_minimum_required(VERSION 3.1) -project(spdlog VERSION 1.3.0 LANGUAGES CXX) +project(spdlog VERSION 1.3.1 LANGUAGES CXX) include(CMakeDependentOption) include(GNUInstallDirs) diff --git a/include/spdlog/version.h b/include/spdlog/version.h index 16b9194b..87a68bd1 100644 --- a/include/spdlog/version.h +++ b/include/spdlog/version.h @@ -7,6 +7,6 @@ #define SPDLOG_VER_MAJOR 1 #define SPDLOG_VER_MINOR 3 -#define SPDLOG_VER_PATCH 0 +#define SPDLOG_VER_PATCH 1 #define SPDLOG_VERSION (SPDLOG_VER_MAJOR * 10000 + SPDLOG_VER_MINOR * 100 + SPDLOG_VER_PATCH) From a29e518cfebb5d5f1be0110b82bb7917112d45c1 Mon Sep 17 00:00:00 2001 From: Pius Raeder Date: Wed, 23 Jan 2019 10:03:03 +0100 Subject: [PATCH 03/39] Disable building benchmarks by default Building the benchmarks requires google-benchmark to be installed which is not the case for most of the build systems. The option now has a tiny hint what the requirement is and where to get it. closes #975 --- CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf2d04f5..eaf9d802 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,6 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCH add_compile_options("-Wconversion") add_compile_options("-pedantic") add_compile_options("-Wfatal-errors") - endif() #--------------------------------------------------------------------------------------- @@ -47,11 +46,11 @@ add_library(spdlog::spdlog ALIAS spdlog) # Check if spdlog is being used directly or via add_subdirectory set(SPDLOG_MASTER_PROJECT OFF) if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - set(SPDLOG_MASTER_PROJECT ON) + set(SPDLOG_MASTER_PROJECT ON) endif() option(SPDLOG_BUILD_EXAMPLES "Build examples" ${SPDLOG_MASTER_PROJECT}) -option(SPDLOG_BUILD_BENCH "Build benchmarks" ${SPDLOG_MASTER_PROJECT}) +option(SPDLOG_BUILD_BENCH "Build benchmarks (Requires https://github.com/google/benchmark.git to be installed)" OFF) option(SPDLOG_BUILD_TESTS "Build tests" ${SPDLOG_MASTER_PROJECT}) option(SPDLOG_FMT_EXTERNAL "Use external fmt library instead of bundled" OFF) From 6e2dadc63a7c7e24d98eba956fe6e69e0e66ba6f Mon Sep 17 00:00:00 2001 From: Mark Niebur Date: Wed, 23 Jan 2019 11:35:55 -0700 Subject: [PATCH 04/39] Add method to filesinks to return filename --- include/spdlog/sinks/basic_file_sink.h | 5 +++++ include/spdlog/sinks/daily_file_sink.h | 5 +++++ include/spdlog/sinks/rotating_file_sink.h | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/include/spdlog/sinks/basic_file_sink.h b/include/spdlog/sinks/basic_file_sink.h index bc5fb5c3..facc7209 100644 --- a/include/spdlog/sinks/basic_file_sink.h +++ b/include/spdlog/sinks/basic_file_sink.h @@ -30,6 +30,11 @@ public: file_helper_.open(filename, truncate); } + const filename_t &filename() const + { + return file_helper_.filename(); + } + protected: void sink_it_(const details::log_msg &msg) override { diff --git a/include/spdlog/sinks/daily_file_sink.h b/include/spdlog/sinks/daily_file_sink.h index 7bf7c448..08392c16 100644 --- a/include/spdlog/sinks/daily_file_sink.h +++ b/include/spdlog/sinks/daily_file_sink.h @@ -63,6 +63,11 @@ public: rotation_tp_ = next_rotation_tp_(); } + const filename_t &filename() const + { + return file_helper_.filename(); + } + protected: void sink_it_(const details::log_msg &msg) override { diff --git a/include/spdlog/sinks/rotating_file_sink.h b/include/spdlog/sinks/rotating_file_sink.h index a579946f..87784f1b 100644 --- a/include/spdlog/sinks/rotating_file_sink.h +++ b/include/spdlog/sinks/rotating_file_sink.h @@ -58,6 +58,11 @@ public: return fmt::to_string(w); } + const filename_t &filename() const + { + return file_helper_.filename(); + } + protected: void sink_it_(const details::log_msg &msg) override { From 3925f8fa16d3e08f26485e177456c44ca599e8ed Mon Sep 17 00:00:00 2001 From: Philip Miller Date: Thu, 24 Jan 2019 00:06:15 -0500 Subject: [PATCH 05/39] streamline constructor logic and improve test for rotate_on_open=true --- include/spdlog/sinks/rotating_file_sink.h | 20 ++++++++++++++++---- tests/test_file_logging.cpp | 19 ++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/include/spdlog/sinks/rotating_file_sink.h b/include/spdlog/sinks/rotating_file_sink.h index 0f057ad9..b2f52226 100644 --- a/include/spdlog/sinks/rotating_file_sink.h +++ b/include/spdlog/sinks/rotating_file_sink.h @@ -36,9 +36,14 @@ public: , max_size_(max_size) , max_files_(max_files) { - file_helper_.open(calc_filename(base_filename_, 0)); if (rotate_on_open) - rotate_(); + { + rotate_(false); + } + else + { + file_helper_.open(calc_filename(base_filename_, 0)); + } current_size_ = file_helper_.size(); // expensive. called only once } @@ -90,7 +95,7 @@ private: // log.1.txt -> log.2.txt // log.2.txt -> log.3.txt // log.3.txt -> delete - void rotate_() + void rotate_(bool reopen=true) { using details::os::filename_to_str; file_helper_.close(); @@ -118,7 +123,14 @@ private: } } } - file_helper_.reopen(true); + if (reopen) + { + file_helper_.reopen(true); + } + else + { + file_helper_.open(base_filename_, true); + } } // delete the target if exists, and rename the src file to target diff --git a/tests/test_file_logging.cpp b/tests/test_file_logging.cpp index 463f77e3..7df61f9e 100644 --- a/tests/test_file_logging.cpp +++ b/tests/test_file_logging.cpp @@ -38,7 +38,7 @@ TEST_CASE("flush_on", "[flush_on]]") REQUIRE(count_lines(filename) == 3); } -TEST_CASE("rotating_file_logger1", "[rotating_logger]]") +TEST_CASE("rotating_file_logger", "[rotating_logger]]") { prepare_logdir(); size_t max_size = 1024 * 10; @@ -55,12 +55,25 @@ TEST_CASE("rotating_file_logger1", "[rotating_logger]]") REQUIRE(count_lines(filename) == 10); } -TEST_CASE("rotating_file_logger2", "[rotating_logger]]") +TEST_CASE("rotating_file_logger2", "[rotating_logger2]]") { prepare_logdir(); size_t max_size = 1024 * 10; std::string basename = "logs/rotating_log"; - auto logger = spdlog::rotating_logger_mt("logger", basename, max_size, 1, true); + + { + // make an initial logger to create the first output file + auto logger = spdlog::rotating_logger_mt("logger", basename, max_size, 2, true); + for (int i = 0; i < 10; ++i) + { + logger->info("Test message {}", i); + } + // drop causes the logger destructor to be called, which is required so the + // next logger can rename the first output file. + spdlog::drop(logger->name()); + } + + auto logger = spdlog::rotating_logger_mt("logger", basename, max_size, 2, true); for (int i = 0; i < 10; ++i) { logger->info("Test message {}", i); From e41b92c55a543a7ab4090a679a55c9797ecb501f Mon Sep 17 00:00:00 2001 From: Philip Miller Date: Thu, 24 Jan 2019 00:11:06 -0500 Subject: [PATCH 06/39] fix inadvertent rename to original test function --- tests/test_file_logging.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_file_logging.cpp b/tests/test_file_logging.cpp index 7df61f9e..dd0c8999 100644 --- a/tests/test_file_logging.cpp +++ b/tests/test_file_logging.cpp @@ -38,7 +38,7 @@ TEST_CASE("flush_on", "[flush_on]]") REQUIRE(count_lines(filename) == 3); } -TEST_CASE("rotating_file_logger", "[rotating_logger]]") +TEST_CASE("rotating_file_logger1", "[rotating_logger]]") { prepare_logdir(); size_t max_size = 1024 * 10; @@ -55,7 +55,7 @@ TEST_CASE("rotating_file_logger", "[rotating_logger]]") REQUIRE(count_lines(filename) == 10); } -TEST_CASE("rotating_file_logger2", "[rotating_logger2]]") +TEST_CASE("rotating_file_logger2", "[rotating_logger]]") { prepare_logdir(); size_t max_size = 1024 * 10; From 4f65fcd7b18b9d1aac29191a9f2821934712d843 Mon Sep 17 00:00:00 2001 From: Philip Miller Date: Thu, 24 Jan 2019 09:19:52 -0500 Subject: [PATCH 07/39] remove minor optimization for the sake of simplicity --- include/spdlog/sinks/rotating_file_sink.h | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/include/spdlog/sinks/rotating_file_sink.h b/include/spdlog/sinks/rotating_file_sink.h index b2f52226..ae0f70f6 100644 --- a/include/spdlog/sinks/rotating_file_sink.h +++ b/include/spdlog/sinks/rotating_file_sink.h @@ -36,15 +36,12 @@ public: , max_size_(max_size) , max_files_(max_files) { - if (rotate_on_open) - { - rotate_(false); - } - else + file_helper_.open(calc_filename(base_filename_, 0)); + current_size_ = file_helper_.size(); // expensive. called only once + if (rotate_on_open && current_size_ > 0) { - file_helper_.open(calc_filename(base_filename_, 0)); + rotate_(); } - current_size_ = file_helper_.size(); // expensive. called only once } // calc filename according to index and file extension if exists. @@ -95,7 +92,7 @@ private: // log.1.txt -> log.2.txt // log.2.txt -> log.3.txt // log.3.txt -> delete - void rotate_(bool reopen=true) + void rotate_() { using details::os::filename_to_str; file_helper_.close(); @@ -123,14 +120,7 @@ private: } } } - if (reopen) - { - file_helper_.reopen(true); - } - else - { - file_helper_.open(base_filename_, true); - } + file_helper_.reopen(true); } // delete the target if exists, and rename the src file to target From 00a7f5d75d289060464575c6506248cea3e5b103 Mon Sep 17 00:00:00 2001 From: Gabi Melman Date: Sun, 27 Jan 2019 19:10:34 +0200 Subject: [PATCH 08/39] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 48264324..55eaeba6 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,10 @@ int main() // define SPDLOG_ACTIVE_LEVEL to desired level SPDLOG_TRACE("Some trace message with param {}", {}); SPDLOG_DEBUG("Some debug message"); - + + // Set the default logger to file logger + auto file_logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt"); + spdlog::set_default_logger(file_logger); } ``` #### create stdout/stderr logger object From 90a299f42489a49122d13e14edba0a0da9466123 Mon Sep 17 00:00:00 2001 From: Sergey Kovalevich Date: Mon, 28 Jan 2019 11:48:45 +0300 Subject: [PATCH 09/39] CMAKE_BINARY_DIR -> CMAKE_CURRENT_BINARY_DIR --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eaf9d802..f0ddaeef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,10 +92,10 @@ endif() set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") set(include_install_dir "${CMAKE_INSTALL_INCLUDEDIR}") set(pkgconfig_install_dir "${CMAKE_INSTALL_LIBDIR}/pkgconfig") -set(version_config "${CMAKE_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake") +set(version_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake") set(project_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake") set(targets_config "${PROJECT_NAME}Targets.cmake") -set(pkg_config "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc") +set(pkg_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc") set(targets_export_name "${PROJECT_NAME}Targets") set(namespace "${PROJECT_NAME}::") From 0f128fd5613905f8e48695fd0193a53196d330bf Mon Sep 17 00:00:00 2001 From: charles-david Date: Thu, 31 Jan 2019 22:47:02 -0500 Subject: [PATCH 10/39] Warning for shadowed parameter corrected in common.h However, not in bundled fmt. Corrects compiling with basic logger with header only and -Werror. --- CMakeLists.txt | 3 ++- include/spdlog/common.h | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0ddaeef..a35de32a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ message(STATUS "Build type: " ${CMAKE_BUILD_TYPE}) #--------------------------------------------------------------------------------------- # compiler config #--------------------------------------------------------------------------------------- -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) @@ -30,6 +30,7 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCH add_compile_options("-Wconversion") add_compile_options("-pedantic") add_compile_options("-Wfatal-errors") + add_compile_options("-Wshadow") endif() #--------------------------------------------------------------------------------------- diff --git a/include/spdlog/common.h b/include/spdlog/common.h index d078a1ab..49d2b865 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -210,10 +210,10 @@ struct source_loc , funcname{""} { } - SPDLOG_CONSTEXPR source_loc(const char *filename, int line, const char *funcname) - : filename{filename} - , line{static_cast(line)} - , funcname{funcname} + SPDLOG_CONSTEXPR source_loc(const char *t_filename, int t_line, const char *t_funcname) + : filename{t_filename} + , line{static_cast(t_line)} + , funcname{t_funcname} { } From e4b7dbce7f5124084b6443f618ef4e670644964d Mon Sep 17 00:00:00 2001 From: charles-david Date: Thu, 31 Jan 2019 23:05:38 -0500 Subject: [PATCH 11/39] CMakeLists.txt same as v1.x branch. --- CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a35de32a..f0ddaeef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ message(STATUS "Build type: " ${CMAKE_BUILD_TYPE}) #--------------------------------------------------------------------------------------- # compiler config #--------------------------------------------------------------------------------------- -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) @@ -30,7 +30,6 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCH add_compile_options("-Wconversion") add_compile_options("-pedantic") add_compile_options("-Wfatal-errors") - add_compile_options("-Wshadow") endif() #--------------------------------------------------------------------------------------- From 20a0f82701c9488ca21274c6e1eeff752ea9bda0 Mon Sep 17 00:00:00 2001 From: charles-david Date: Fri, 1 Feb 2019 07:59:50 -0500 Subject: [PATCH 12/39] Renamed input parameters to "params_in". --- include/spdlog/common.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/spdlog/common.h b/include/spdlog/common.h index 49d2b865..d8c5811c 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -210,10 +210,10 @@ struct source_loc , funcname{""} { } - SPDLOG_CONSTEXPR source_loc(const char *t_filename, int t_line, const char *t_funcname) - : filename{t_filename} - , line{static_cast(t_line)} - , funcname{t_funcname} + SPDLOG_CONSTEXPR source_loc(const char *filename_in, int line_in, const char *funcname_in) + : filename{filename_in} + , line{static_cast(line_in)} + , funcname{funcname_in} { } From 734af31c1354f4861f54b7f297f17db2190cda8b Mon Sep 17 00:00:00 2001 From: Francois Chabot Date: Fri, 1 Feb 2019 12:12:58 -0500 Subject: [PATCH 13/39] Allow the inclusion of an external fmtlib as as sub_directory --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0ddaeef..8da5f3a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,7 +54,7 @@ option(SPDLOG_BUILD_BENCH "Build benchmarks (Requires https://github.com/google/ option(SPDLOG_BUILD_TESTS "Build tests" ${SPDLOG_MASTER_PROJECT}) option(SPDLOG_FMT_EXTERNAL "Use external fmt library instead of bundled" OFF) -if(SPDLOG_FMT_EXTERNAL) +if(SPDLOG_FMT_EXTERNAL AND NOT TARGET fmt::fmt) find_package(fmt REQUIRED CONFIG) endif() From 79f11bd655fdf501839ab8f12020b40263199cdc Mon Sep 17 00:00:00 2001 From: DanielChabrowski Date: Sun, 3 Feb 2019 16:12:00 +0100 Subject: [PATCH 14/39] Allow custom formatter in sink ctor --- include/spdlog/sinks/sink.h | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/include/spdlog/sinks/sink.h b/include/spdlog/sinks/sink.h index 2f1adc10..d8325233 100644 --- a/include/spdlog/sinks/sink.h +++ b/include/spdlog/sinks/sink.h @@ -14,15 +14,10 @@ namespace sinks { class sink { public: - sink() - : level_(level::trace) - , formatter_(new pattern_formatter()) - { - } + sink() = default; - explicit sink(std::unique_ptr formatter) - : level_(level::trace) - , formatter_(std::move(formatter)) + explicit sink(std::unique_ptr formatter) + : formatter_{std::move(formatter)} { } @@ -49,10 +44,10 @@ public: protected: // sink log level - default is all - level_t level_; + level_t level_{level::trace}; // sink formatter - default is full format - std::unique_ptr formatter_; + std::unique_ptr formatter_{details::make_unique()}; }; } // namespace sinks From a6229d9e87ec40b2536b0f4a71c671fbb9090048 Mon Sep 17 00:00:00 2001 From: DanielChabrowski Date: Wed, 6 Feb 2019 05:24:25 +0100 Subject: [PATCH 15/39] Remove pointless log with enable_if --- include/spdlog/details/logger_impl.h | 18 ++++++------------ include/spdlog/logger.h | 7 +------ 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/include/spdlog/details/logger_impl.h b/include/spdlog/details/logger_impl.h index 0212ede5..d44652b5 100644 --- a/include/spdlog/details/logger_impl.h +++ b/include/spdlog/details/logger_impl.h @@ -102,6 +102,12 @@ inline void spdlog::logger::log(level::level_enum lvl, const char *msg) log(source_loc{}, lvl, msg); } +template +inline void spdlog::logger::log(level::level_enum lvl, const T &msg) +{ + log(source_loc{}, lvl, msg); +} + template::value, T>::type *> inline void spdlog::logger::log(source_loc source, level::level_enum lvl, const T &msg) { @@ -117,12 +123,6 @@ inline void spdlog::logger::log(source_loc source, level::level_enum lvl, const SPDLOG_CATCH_AND_HANDLE } -template::value, T>::type *> -inline void spdlog::logger::log(level::level_enum lvl, const T &msg) -{ - log(source_loc{}, lvl, msg); -} - template::value, T>::type *> inline void spdlog::logger::log(source_loc source, level::level_enum lvl, const T &msg) { @@ -141,12 +141,6 @@ inline void spdlog::logger::log(source_loc source, level::level_enum lvl, const SPDLOG_CATCH_AND_HANDLE } -template::value, T>::type *> -inline void spdlog::logger::log(level::level_enum lvl, const T &msg) -{ - log(source_loc{}, lvl, msg); -} - template inline void spdlog::logger::trace(const char *fmt, const Args &... args) { diff --git a/include/spdlog/logger.h b/include/spdlog/logger.h index 3dbaaa64..ec06828f 100644 --- a/include/spdlog/logger.h +++ b/include/spdlog/logger.h @@ -100,18 +100,13 @@ public: #endif // _WIN32 #endif // SPDLOG_WCHAR_TO_UTF8_SUPPORT - // T can be statically converted to string_view - template::value, T>::type * = nullptr> + template void log(level::level_enum lvl, const T &); // T can be statically converted to string_view template::value, T>::type * = nullptr> void log(source_loc loc, level::level_enum lvl, const T &); - // T cannot be statically converted to string_view - template::value, T>::type * = nullptr> - void log(level::level_enum lvl, const T &); - // T cannot be statically converted to string_view template::value, T>::type * = nullptr> void log(source_loc loc, level::level_enum lvl, const T &); From 9fca0b20f0a82e021cf1b54bfbad2c222a3a8982 Mon Sep 17 00:00:00 2001 From: Martin Green Date: Wed, 6 Feb 2019 07:38:26 +0200 Subject: [PATCH 16/39] Add CMake option for conditional installation --- CMakeLists.txt | 110 +++++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8da5f3a9..9f0951fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,7 @@ option(SPDLOG_BUILD_EXAMPLES "Build examples" ${SPDLOG_MASTER_PROJECT}) option(SPDLOG_BUILD_BENCH "Build benchmarks (Requires https://github.com/google/benchmark.git to be installed)" OFF) option(SPDLOG_BUILD_TESTS "Build tests" ${SPDLOG_MASTER_PROJECT}) option(SPDLOG_FMT_EXTERNAL "Use external fmt library instead of bundled" OFF) +option(SPDLOG_INSTALL "Generate the install target." ${SPDLOG_MASTER_PROJECT}) if(SPDLOG_FMT_EXTERNAL AND NOT TARGET fmt::fmt) find_package(fmt REQUIRED CONFIG) @@ -88,59 +89,60 @@ endif() #--------------------------------------------------------------------------------------- # Install/export targets and files #--------------------------------------------------------------------------------------- -# set files and directories -set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") -set(include_install_dir "${CMAKE_INSTALL_INCLUDEDIR}") -set(pkgconfig_install_dir "${CMAKE_INSTALL_LIBDIR}/pkgconfig") -set(version_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake") -set(project_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake") -set(targets_config "${PROJECT_NAME}Targets.cmake") -set(pkg_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc") -set(targets_export_name "${PROJECT_NAME}Targets") -set(namespace "${PROJECT_NAME}::") - -# generate package version file -include(CMakePackageConfigHelpers) -write_basic_package_version_file( - "${version_config}" COMPATIBILITY SameMajorVersion -) - -# configure pkg config file -configure_file("cmake/spdlog.pc.in" "${pkg_config}" @ONLY) -# configure spdlogConfig.cmake file -configure_file("cmake/Config.cmake.in" "${project_config}" @ONLY) - -# install targets -install( - TARGETS spdlog - EXPORT "${targets_export_name}" -) - -# install headers -install( - DIRECTORY "${HEADER_BASE}/${PROJECT_NAME}" - DESTINATION "${include_install_dir}" -) - -# install project config and version file -install( - FILES "${project_config}" "${version_config}" - DESTINATION "${config_install_dir}" -) - -# install pkg config file -install( - FILES "${pkg_config}" - DESTINATION "${pkgconfig_install_dir}" -) - -# install targets config file -install( - EXPORT "${targets_export_name}" - NAMESPACE "${namespace}" - DESTINATION "${config_install_dir}" - FILE ${targets_config} -) +if(SPDLOG_INSTALL) + # set files and directories + set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + set(include_install_dir "${CMAKE_INSTALL_INCLUDEDIR}") + set(pkgconfig_install_dir "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + set(version_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake") + set(project_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake") + set(targets_config "${PROJECT_NAME}Targets.cmake") + set(pkg_config "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc") + set(targets_export_name "${PROJECT_NAME}Targets") + set(namespace "${PROJECT_NAME}::") + + # generate package version file + include(CMakePackageConfigHelpers) + write_basic_package_version_file( + "${version_config}" COMPATIBILITY SameMajorVersion + ) + + # configure pkg config file + configure_file("cmake/spdlog.pc.in" "${pkg_config}" @ONLY) + # configure spdlogConfig.cmake file + configure_file("cmake/Config.cmake.in" "${project_config}" @ONLY) + + # install targets + install( + TARGETS spdlog + EXPORT "${targets_export_name}" + ) + + # install headers + install( + DIRECTORY "${HEADER_BASE}/${PROJECT_NAME}" + DESTINATION "${include_install_dir}" + ) + + # install project config and version file + install( + FILES "${project_config}" "${version_config}" + DESTINATION "${config_install_dir}" + ) + + # install pkg config file + install( + FILES "${pkg_config}" + DESTINATION "${pkgconfig_install_dir}" + ) + + # install targets config file + install( + EXPORT "${targets_export_name}" + NAMESPACE "${namespace}" + DESTINATION "${config_install_dir}" + FILE ${targets_config} + ) # export build directory targets file export( @@ -152,5 +154,7 @@ export( # register project in CMake user registry export(PACKAGE ${PROJECT_NAME}) +endif() + file(GLOB_RECURSE spdlog_include_SRCS "${HEADER_BASE}/*.h") add_custom_target(spdlog_headers_for_ide SOURCES ${spdlog_include_SRCS}) From d235e7d46fe97439a9aae861010061047e985da7 Mon Sep 17 00:00:00 2001 From: Gabi Melman Date: Fri, 8 Feb 2019 12:14:17 +0200 Subject: [PATCH 17/39] Fix #992 --- include/spdlog/sinks/stdout_color_sinks.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/spdlog/sinks/stdout_color_sinks.h b/include/spdlog/sinks/stdout_color_sinks.h index 74bfceb4..5accda44 100644 --- a/include/spdlog/sinks/stdout_color_sinks.h +++ b/include/spdlog/sinks/stdout_color_sinks.h @@ -51,6 +51,6 @@ inline std::shared_ptr stderr_color_mt(const std::string &logger_name) template inline std::shared_ptr stderr_color_st(const std::string &logger_name) { - return Factory::template create(logger_name); + return Factory::template create(logger_name); } } // namespace spdlog From 4f86448bd463fc9a955e87dcd7acde039ccb6c55 Mon Sep 17 00:00:00 2001 From: Romain Thomas Date: Wed, 13 Feb 2019 09:19:29 +0100 Subject: [PATCH 18/39] Fix typo in Android logger --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55eaeba6..b73b88aa 100644 --- a/README.md +++ b/README.md @@ -313,7 +313,7 @@ void syslog_example() void android_example() { std::string tag = "spdlog-android"; - auto android_logger = spdlog::android_logger("android", tag); + auto android_logger = spdlog::android_logger_mt("android", tag); android_logger->critical("Use \"adb shell logcat\" to view this message."); } ``` From 0ccbdcdd1f23af719f62bd00346aacbdce598335 Mon Sep 17 00:00:00 2001 From: Mattias Fornander Date: Mon, 18 Feb 2019 14:33:41 -0700 Subject: [PATCH 19/39] Add tweak support for user short level names --- include/spdlog/common.h | 7 +++++-- include/spdlog/tweakme.h | 9 ++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/include/spdlog/common.h b/include/spdlog/common.h index d8c5811c..dd9a4785 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -125,9 +125,12 @@ enum level_enum "trace", "debug", "info", "warning", "error", "critical", "off" \ } #endif - static string_view_t level_string_views[] SPDLOG_LEVEL_NAMES; -static const char *short_level_names[]{"T", "D", "I", "W", "E", "C", "O"}; + +#if !defined(SPDLOG_SHORT_LEVEL_NAMES) +#define SPDLOG_SHORT_LEVEL_NAMES {"T", "D", "I", "W", "E", "C", "O"} +#endif +static const char *short_level_names[] SPDLOG_SHORT_LEVEL_NAMES; inline string_view_t &to_string_view(spdlog::level::level_enum l) SPDLOG_NOEXCEPT { diff --git a/include/spdlog/tweakme.h b/include/spdlog/tweakme.h index b3b71e4f..dfcb09d2 100644 --- a/include/spdlog/tweakme.h +++ b/include/spdlog/tweakme.h @@ -121,6 +121,13 @@ // "MY ERROR", "MY CRITICAL", "OFF" } /////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Uncomment to customize short level names (e.g. "MT") +// These can be longer than one character. +// +// #define SPDLOG_SHORT_LEVEL_NAMES { "T", "D", "I", "W", "E", "C", "O" } +/////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////// // Uncomment to disable default logger creation. // This might save some (very) small initialization time if no default logger is needed. @@ -142,4 +149,4 @@ // Defaults to __FUNCTION__ (should work on all compilers) if not defined. // // #define SPDLOG_FUNCTION __PRETTY_FUNCTION__ -/////////////////////////////////////////////////////////////////////////////// \ No newline at end of file +/////////////////////////////////////////////////////////////////////////////// From 63cfb7db25ac0cd32644435719a3ef93401b9fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20W=C3=B6rter?= Date: Mon, 11 Mar 2019 14:12:26 +0100 Subject: [PATCH 20/39] Exposed should_do_colors_ in ansicolor_sink.h. [#1004] --- include/spdlog/sinks/ansicolor_sink.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/spdlog/sinks/ansicolor_sink.h b/include/spdlog/sinks/ansicolor_sink.h index 7c5e3539..e293da08 100644 --- a/include/spdlog/sinks/ansicolor_sink.h +++ b/include/spdlog/sinks/ansicolor_sink.h @@ -133,6 +133,11 @@ public: formatter_ = std::move(sink_formatter); } + bool colors_enabled() + { + return should_do_colors_; + } + private: void print_ccode_(const std::string &color_code) { From 1caf05cc52721dedbc32109040d205fe75593c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20W=C3=B6rter?= Date: Mon, 11 Mar 2019 14:15:58 +0100 Subject: [PATCH 21/39] Renamed exposed method. [#1004] --- include/spdlog/sinks/ansicolor_sink.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/spdlog/sinks/ansicolor_sink.h b/include/spdlog/sinks/ansicolor_sink.h index e293da08..1cb797ba 100644 --- a/include/spdlog/sinks/ansicolor_sink.h +++ b/include/spdlog/sinks/ansicolor_sink.h @@ -133,7 +133,7 @@ public: formatter_ = std::move(sink_formatter); } - bool colors_enabled() + bool should_color() { return should_do_colors_; } From 053d5ad24d9a58063f2bd71c186cb6adf807ea0a Mon Sep 17 00:00:00 2001 From: Gabi Melman Date: Mon, 11 Mar 2019 19:19:36 +0200 Subject: [PATCH 22/39] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index b73b88aa..e51f2721 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ Very fast, header only, C++ logging library. [![Build Status](https://travis-ci. #### Or use your favorite package manager: -* Ubuntu: `apt-get install libspdlog-dev` * Homebrew: `brew install spdlog` * FreeBSD: `cd /usr/ports/devel/spdlog/ && make install clean` * Fedora: `yum install spdlog` From af80db8c22f240120d3d4744ddc5501f25a87101 Mon Sep 17 00:00:00 2001 From: Alexander Zvyagin Date: Thu, 14 Mar 2019 16:20:58 +0100 Subject: [PATCH 23/39] Add systemd sink. --- include/spdlog/sinks/systemd_sink.h | 90 +++++++++++++++++++++++++++++ tests/test_systemd.cpp | 35 +++++++++++ 2 files changed, 125 insertions(+) create mode 100644 include/spdlog/sinks/systemd_sink.h create mode 100644 tests/test_systemd.cpp diff --git a/include/spdlog/sinks/systemd_sink.h b/include/spdlog/sinks/systemd_sink.h new file mode 100644 index 00000000..fe748a6b --- /dev/null +++ b/include/spdlog/sinks/systemd_sink.h @@ -0,0 +1,90 @@ +// +// Copyright(c) 2015 Gabi Melman. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) +// + +#pragma once + +#ifndef SPDLOG_H +#include "spdlog/spdlog.h" +#endif + +#include "spdlog/sinks/base_sink.h" + +#include +#include +#include + +namespace spdlog { +namespace sinks { + +inline int syslog_level(level::level_enum l) { + switch(l) { + case level::off: + case level::trace: + case level::debug: + return LOG_DEBUG; + case level::info: + return LOG_INFO; + case level::warn: + return LOG_WARNING; + case level::err: + return LOG_ERR; + case level::critical: + return LOG_CRIT; + default: + throw std::invalid_argument("systemd_sink.h syslog_level()"); + } +} + +/** + * Sink that write to systemd using the `sd_journal_print()` library call. + * + * Locking is not needed, as `sd_journal_print()` itself is thread-safe. + */ +template +class systemd_sink : public base_sink +{ +public: + // + explicit systemd_sink(void) {} + + ~systemd_sink() override {} + + systemd_sink(const systemd_sink &) = delete; + systemd_sink &operator=(const systemd_sink &) = delete; + +protected: + void sink_it_(const details::log_msg &msg) override + { + if( sd_journal_print( + syslog_level(msg.level), + "%s", + fmt::to_string(msg.payload).c_str() + ) + ) + throw spdlog_ex("Failed writing to systemd"); + } + + void flush_() override {} +}; + +using systemd_sink_mt = systemd_sink; +using systemd_sink_st = systemd_sink; +} // namespace sinks + +// Create and register a syslog logger +template +inline std::shared_ptr systemd_logger_mt( + const std::string &logger_name) +{ + return Factory::template create(logger_name); +} + +template +inline std::shared_ptr systemd_logger_st( + const std::string &logger_name) +{ + return Factory::template create(logger_name); +} +} // namespace spdlog diff --git a/tests/test_systemd.cpp b/tests/test_systemd.cpp new file mode 100644 index 00000000..a75bc765 --- /dev/null +++ b/tests/test_systemd.cpp @@ -0,0 +1,35 @@ +#include "includes.h" +#include + +namespace { +const char *tested_logger_name = "main"; +} + +void run(spdlog::logger &logger) { + logger.debug("test debug"); + logger.error("test error"); + logger.info("test info"); +} + +// std::shared_ptr create_stdout_and_systemd_logger( +// std::string name="", +// spdlog::level::level_enum level_stdout=spdlog::level::level_enum::debug, +// spdlog::level::level_enum level_systemd=spdlog::level::level_enum::err +// ) { +// auto console_sink = std::make_shared(); +// console_sink->set_level(level_stdout); +// auto systemd_sink = std::make_shared(); +// systemd_sink->set_level(level_systemd); +// return std::make_shared(name, {console_sink, systemd_sink}); + +// } + +TEST_CASE("systemd", "[all]") +{ + auto console_sink = std::make_shared(); + console_sink->set_level(spdlog::level::level_enum::debug); + auto systemd_sink = std::make_shared(); + systemd_sink->set_level(spdlog::level::level_enum::err); + spdlog::logger logger("spdlog_systemd_test", {console_sink, systemd_sink}); + run(logger); +} From cc98e9850dc7299a77c689113e61487e2a1f7c14 Mon Sep 17 00:00:00 2001 From: Alexander Zvyagin Date: Wed, 20 Mar 2019 15:29:38 +0100 Subject: [PATCH 24/39] Avoid unnecessary conversion of log_msg::payload to std::string. --- include/spdlog/sinks/systemd_sink.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/spdlog/sinks/systemd_sink.h b/include/spdlog/sinks/systemd_sink.h index fe748a6b..d6b9db73 100644 --- a/include/spdlog/sinks/systemd_sink.h +++ b/include/spdlog/sinks/systemd_sink.h @@ -59,8 +59,9 @@ protected: { if( sd_journal_print( syslog_level(msg.level), - "%s", - fmt::to_string(msg.payload).c_str() + "%.*s", + static_cast(msg.payload.size()), + msg.payload.data() ) ) throw spdlog_ex("Failed writing to systemd"); From 4706b0ada4127ed454f500ccc93767fb5a63dca7 Mon Sep 17 00:00:00 2001 From: Alexander Zvyagin Date: Wed, 20 Mar 2019 15:32:47 +0100 Subject: [PATCH 25/39] Add signature. --- include/spdlog/sinks/systemd_sink.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/spdlog/sinks/systemd_sink.h b/include/spdlog/sinks/systemd_sink.h index d6b9db73..fa9efd83 100644 --- a/include/spdlog/sinks/systemd_sink.h +++ b/include/spdlog/sinks/systemd_sink.h @@ -1,5 +1,5 @@ // -// Copyright(c) 2015 Gabi Melman. +// Copyright(c) 2019 ZVYAGIN.Alexander@gmail.com // Distributed under the MIT License (http://opensource.org/licenses/MIT) // From 3ca19a85802f67d89cb2cb95b70922ddc48c8c75 Mon Sep 17 00:00:00 2001 From: gabime Date: Fri, 22 Mar 2019 14:01:34 +0200 Subject: [PATCH 26/39] fix link to systemd in tests --- tests/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Makefile b/tests/Makefile index bec3026d..c9ce3c01 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,6 +1,6 @@ CXX ?= g++ CXXFLAGS = -Wall -pedantic -std=c++11 -pthread -Wconversion -O3 -I../include -fmax-errors=1 -LDPFALGS = -pthread +LDPFALGS = -pthread -lsystemd CPP_FILES := $(wildcard *.cpp) OBJ_FILES := $(addprefix ./,$(notdir $(CPP_FILES:.cpp=.o))) From b084b8b1d8461cb7a4eb8f312c297162238fad2b Mon Sep 17 00:00:00 2001 From: gabime Date: Fri, 22 Mar 2019 14:16:16 +0200 Subject: [PATCH 27/39] Cleaned systemd test --- tests/test_systemd.cpp | 32 +++++--------------------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/tests/test_systemd.cpp b/tests/test_systemd.cpp index a75bc765..0909082c 100644 --- a/tests/test_systemd.cpp +++ b/tests/test_systemd.cpp @@ -1,35 +1,13 @@ #include "includes.h" #include -namespace { -const char *tested_logger_name = "main"; -} - -void run(spdlog::logger &logger) { - logger.debug("test debug"); - logger.error("test error"); - logger.info("test info"); -} - -// std::shared_ptr create_stdout_and_systemd_logger( -// std::string name="", -// spdlog::level::level_enum level_stdout=spdlog::level::level_enum::debug, -// spdlog::level::level_enum level_systemd=spdlog::level::level_enum::err -// ) { -// auto console_sink = std::make_shared(); -// console_sink->set_level(level_stdout); -// auto systemd_sink = std::make_shared(); -// systemd_sink->set_level(level_systemd); -// return std::make_shared(name, {console_sink, systemd_sink}); - -// } - TEST_CASE("systemd", "[all]") { - auto console_sink = std::make_shared(); - console_sink->set_level(spdlog::level::level_enum::debug); auto systemd_sink = std::make_shared(); systemd_sink->set_level(spdlog::level::level_enum::err); - spdlog::logger logger("spdlog_systemd_test", {console_sink, systemd_sink}); - run(logger); + spdlog::logger logger("spdlog_systemd_test", systemd_sink); + + logger.debug("test debug"); + logger.error("test error"); + logger.info("test info"); } From eb478e38b26b6eb35fde9c3c1d4c9cba9d0802a1 Mon Sep 17 00:00:00 2001 From: tt4g Date: Mon, 25 Mar 2019 12:46:35 +0900 Subject: [PATCH 28/39] Add spdlog::initialize_logger --- include/spdlog/spdlog.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/include/spdlog/spdlog.h b/include/spdlog/spdlog.h index 20ff24be..79a75196 100644 --- a/include/spdlog/spdlog.h +++ b/include/spdlog/spdlog.h @@ -47,6 +47,21 @@ inline std::shared_ptr create(std::string logger_name, SinkArgs return default_factory::create(std::move(logger_name), std::forward(sink_args)...); } +// Initialize and register a logger, +// formatter and flush level will be set according the global settings. +// +// NOTE: +// Use this function when creating loggers manually. +// +// Example: +// auto console_sink = std::make_shared(); +// auto console_logger = std::make_shared("console_logger", console_sink); +// spdlog::initialize_logger(console_logger); +inline void initialize_logger(std::shared_ptr logger) +{ + details::registry::instance().initialize_logger(std::move(logger)); +} + // Return an existing logger or nullptr if a logger with such name doesn't // exist. // example: spdlog::get("my_logger")->info("hello {}", "world"); From cd65d6de69d71f79a4e13cf7dced3ca204d08670 Mon Sep 17 00:00:00 2001 From: Ponnuvel Palaniyappan Date: Sun, 31 Mar 2019 22:05:37 +0100 Subject: [PATCH 29/39] namespace qualify stat functions --- include/spdlog/details/os.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index 646805e6..8e8476f0 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -196,7 +196,7 @@ inline bool file_exists(const filename_t &filename) SPDLOG_NOEXCEPT return (attribs != INVALID_FILE_ATTRIBUTES && !(attribs & FILE_ATTRIBUTE_DIRECTORY)); #else // common linux/unix all have the stat system call struct stat buffer; - return (stat(filename.c_str(), &buffer) == 0); + return (::stat(filename.c_str(), &buffer) == 0); #endif } @@ -229,14 +229,14 @@ inline size_t filesize(FILE *f) // 64 bits(but not in osx or cygwin, where fstat64 is deprecated) #if !defined(__FreeBSD__) && !defined(__APPLE__) && (defined(__x86_64__) || defined(__ppc64__)) && !defined(__CYGWIN__) struct stat64 st; - if (fstat64(fd, &st) == 0) + if (::fstat64(fd, &st) == 0) { return static_cast(st.st_size); } #else // unix 32 bits or cygwin struct stat st; - if (fstat(fd, &st) == 0) + if (::fstat(fd, &st) == 0) { return static_cast(st.st_size); } From d366a06461e216884215dbb440e90a049b0596ce Mon Sep 17 00:00:00 2001 From: Daniel Binsmaier Date: Thu, 4 Apr 2019 09:25:21 +0200 Subject: [PATCH 30/39] Fix unexpected log macro expansion --- include/spdlog/spdlog.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/spdlog/spdlog.h b/include/spdlog/spdlog.h index 79a75196..74f01a06 100644 --- a/include/spdlog/spdlog.h +++ b/include/spdlog/spdlog.h @@ -327,8 +327,10 @@ inline void critical(const wchar_t *fmt, const Args &... args) // #define SPDLOG_LOGGER_CALL(logger, level, ...) \ - if (logger->should_log(level)) \ - logger->log(spdlog::source_loc{SPDLOG_FILE_BASENAME(__FILE__), __LINE__, SPDLOG_FUNCTION}, level, __VA_ARGS__) + do { \ + if (logger->should_log(level)) \ + logger->log(spdlog::source_loc{SPDLOG_FILE_BASENAME(__FILE__), __LINE__, SPDLOG_FUNCTION}, level, __VA_ARGS__) \ + } while (0) #if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_TRACE #define SPDLOG_LOGGER_TRACE(logger, ...) SPDLOG_LOGGER_CALL(logger, spdlog::level::trace, __VA_ARGS__) From 631416d54a139ddd28d90feff4f494340802eb52 Mon Sep 17 00:00:00 2001 From: Daniel Binsmaier Date: Thu, 4 Apr 2019 12:04:53 +0200 Subject: [PATCH 31/39] Fix missing ';' in log macros --- include/spdlog/spdlog.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/spdlog/spdlog.h b/include/spdlog/spdlog.h index 74f01a06..87a7c184 100644 --- a/include/spdlog/spdlog.h +++ b/include/spdlog/spdlog.h @@ -329,7 +329,7 @@ inline void critical(const wchar_t *fmt, const Args &... args) #define SPDLOG_LOGGER_CALL(logger, level, ...) \ do { \ if (logger->should_log(level)) \ - logger->log(spdlog::source_loc{SPDLOG_FILE_BASENAME(__FILE__), __LINE__, SPDLOG_FUNCTION}, level, __VA_ARGS__) \ + logger->log(spdlog::source_loc{SPDLOG_FILE_BASENAME(__FILE__), __LINE__, SPDLOG_FUNCTION}, level, __VA_ARGS__); \ } while (0) #if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_TRACE From ad63efdaf772582631eca20783aaa8c2badd7766 Mon Sep 17 00:00:00 2001 From: Martin Krammer <43210132+martinkrammer@users.noreply.github.com> Date: Sat, 6 Apr 2019 11:17:11 +0200 Subject: [PATCH 32/39] Update README.md In order to use basic_logger_mt an additional include is required. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e51f2721..7b3d39d7 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,8 @@ async... Elapsed: 0.349851 2,858,358/sec #### Basic usage ```c++ #include "spdlog/spdlog.h" +#include "spdlog/sinks/basic_file_sink.h" + int main() { spdlog::info("Welcome to spdlog!"); From a984b1b073564e0d29b5ec540b127319ddb5752c Mon Sep 17 00:00:00 2001 From: Martin Green Date: Sun, 7 Apr 2019 17:12:41 +0300 Subject: [PATCH 33/39] Add a CMake option to use a header-only external fmt --- CMakeLists.txt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f0951fc..3dd13060 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,12 +53,9 @@ option(SPDLOG_BUILD_EXAMPLES "Build examples" ${SPDLOG_MASTER_PROJECT}) option(SPDLOG_BUILD_BENCH "Build benchmarks (Requires https://github.com/google/benchmark.git to be installed)" OFF) option(SPDLOG_BUILD_TESTS "Build tests" ${SPDLOG_MASTER_PROJECT}) option(SPDLOG_FMT_EXTERNAL "Use external fmt library instead of bundled" OFF) +option(SPDLOG_FMT_HEADER_ONLY "Use header-only variant of external fmt library" OFF) option(SPDLOG_INSTALL "Generate the install target." ${SPDLOG_MASTER_PROJECT}) -if(SPDLOG_FMT_EXTERNAL AND NOT TARGET fmt::fmt) - find_package(fmt REQUIRED CONFIG) -endif() - target_include_directories( spdlog INTERFACE @@ -68,7 +65,16 @@ target_include_directories( if(SPDLOG_FMT_EXTERNAL) target_compile_definitions(spdlog INTERFACE SPDLOG_FMT_EXTERNAL) - target_link_libraries(spdlog INTERFACE fmt::fmt) + + if(NOT TARGET fmt::fmt) + find_package(fmt REQUIRED CONFIG) + endif() + + if(SPDLOG_FMT_HEADER_ONLY) + target_link_libraries(spdlog INTERFACE fmt::fmt-header-only) + else() + target_link_libraries(spdlog INTERFACE fmt::fmt) + endif() endif() set(HEADER_BASE "${CMAKE_CURRENT_SOURCE_DIR}/include") From 7e63d773ef85a3864094e505afdd505118c4f99d Mon Sep 17 00:00:00 2001 From: Martin Green Date: Wed, 10 Apr 2019 06:49:57 +0300 Subject: [PATCH 34/39] Make header-only external fmt the default --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3dd13060..12fe8bb5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,7 +53,7 @@ option(SPDLOG_BUILD_EXAMPLES "Build examples" ${SPDLOG_MASTER_PROJECT}) option(SPDLOG_BUILD_BENCH "Build benchmarks (Requires https://github.com/google/benchmark.git to be installed)" OFF) option(SPDLOG_BUILD_TESTS "Build tests" ${SPDLOG_MASTER_PROJECT}) option(SPDLOG_FMT_EXTERNAL "Use external fmt library instead of bundled" OFF) -option(SPDLOG_FMT_HEADER_ONLY "Use header-only variant of external fmt library" OFF) +option(SPDLOG_FMT_HEADER_ONLY "Use header-only variant of external fmt library" ON) option(SPDLOG_INSTALL "Generate the install target." ${SPDLOG_MASTER_PROJECT}) target_include_directories( From 79938b98da9cd70a77fab068fed0c1a2f53b2c58 Mon Sep 17 00:00:00 2001 From: Jan Niklas Hasse Date: Wed, 17 Apr 2019 15:18:16 +0200 Subject: [PATCH 35/39] Remove unnecessary semicolons (-Wextra-semi) --- include/spdlog/details/pattern_formatter.h | 42 +++++++++++----------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/include/spdlog/details/pattern_formatter.h b/include/spdlog/details/pattern_formatter.h index c0ad86e8..60ed72ad 100644 --- a/include/spdlog/details/pattern_formatter.h +++ b/include/spdlog/details/pattern_formatter.h @@ -352,7 +352,7 @@ class Y_formatter final : public flag_formatter { public: explicit Y_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { @@ -418,7 +418,7 @@ class I_formatter final : public flag_formatter { public: explicit I_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { @@ -433,7 +433,7 @@ class M_formatter final : public flag_formatter { public: explicit M_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { @@ -448,7 +448,7 @@ class S_formatter final : public flag_formatter { public: explicit S_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { @@ -463,7 +463,7 @@ class e_formatter final : public flag_formatter { public: explicit e_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -486,7 +486,7 @@ class f_formatter final : public flag_formatter { public: explicit f_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -509,7 +509,7 @@ class F_formatter final : public flag_formatter { public: explicit F_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -532,7 +532,7 @@ class E_formatter final : public flag_formatter { public: explicit E_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -549,7 +549,7 @@ class p_formatter final : public flag_formatter { public: explicit p_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { @@ -564,7 +564,7 @@ class r_formatter final : public flag_formatter { public: explicit r_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { @@ -586,7 +586,7 @@ class R_formatter final : public flag_formatter { public: explicit R_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { @@ -604,7 +604,7 @@ class T_formatter final : public flag_formatter { public: explicit T_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &tm_time, fmt::memory_buffer &dest) override { @@ -624,7 +624,7 @@ class z_formatter final : public flag_formatter { public: explicit z_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} const std::chrono::seconds cache_refresh = std::chrono::seconds(5); @@ -683,7 +683,7 @@ class t_formatter final : public flag_formatter { public: explicit t_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -705,7 +705,7 @@ class pid_formatter final : public flag_formatter { public: explicit pid_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &, const std::tm &, fmt::memory_buffer &dest) override { @@ -728,7 +728,7 @@ class i_formatter final : public flag_formatter { public: explicit i_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -742,7 +742,7 @@ class v_formatter final : public flag_formatter { public: explicit v_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -829,7 +829,7 @@ class source_location_formatter final : public flag_formatter { public: explicit source_location_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -858,7 +858,7 @@ class source_filename_formatter final : public flag_formatter { public: explicit source_filename_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -875,7 +875,7 @@ class source_linenum_formatter final : public flag_formatter { public: explicit source_linenum_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { @@ -900,7 +900,7 @@ class source_funcname_formatter final : public flag_formatter { public: explicit source_funcname_formatter(padding_info padinfo) - : flag_formatter(padinfo){}; + : flag_formatter(padinfo){} void format(const details::log_msg &msg, const std::tm &, fmt::memory_buffer &dest) override { From 5e856c6b4da77ca7d4c15dc494ffbfc489a50d48 Mon Sep 17 00:00:00 2001 From: Philip Salzmann Date: Thu, 9 May 2019 13:16:38 +0200 Subject: [PATCH 36/39] Add mode enum to control output of color sinks This adds a new "color_mode" enum that can be used to control the color code output behavior of sinks with color support. It can be one of three values: always, automatic and never. --- include/spdlog/common.h | 10 ++++++++++ include/spdlog/sinks/ansicolor_sink.h | 20 ++++++++++++++++++-- include/spdlog/sinks/stdout_color_sinks.h | 16 ++++++++-------- include/spdlog/sinks/wincolor_sink.h | 22 +++++++++++++++++++--- 4 files changed, 55 insertions(+), 13 deletions(-) diff --git a/include/spdlog/common.h b/include/spdlog/common.h index dd9a4785..85e3cecd 100644 --- a/include/spdlog/common.h +++ b/include/spdlog/common.h @@ -159,6 +159,16 @@ inline spdlog::level::level_enum from_str(const std::string &name) SPDLOG_NOEXCE using level_hasher = std::hash; } // namespace level +// +// Color mode used by sinks with color support. +// +enum class color_mode +{ + always, + automatic, + never +}; + // // Pattern time - specific time getting to use for pattern_formatter. // local time by default diff --git a/include/spdlog/sinks/ansicolor_sink.h b/include/spdlog/sinks/ansicolor_sink.h index 1cb797ba..3563e7b6 100644 --- a/include/spdlog/sinks/ansicolor_sink.h +++ b/include/spdlog/sinks/ansicolor_sink.h @@ -33,12 +33,12 @@ class ansicolor_sink final : public sink { public: using mutex_t = typename ConsoleMutex::mutex_t; - ansicolor_sink() + ansicolor_sink(color_mode mode = color_mode::automatic) : target_file_(TargetStream::stream()) , mutex_(ConsoleMutex::mutex()) { - should_do_colors_ = details::os::in_terminal(target_file_) && details::os::is_color_terminal(); + set_color_mode(mode); colors_[level::trace] = white; colors_[level::debug] = cyan; colors_[level::info] = green; @@ -138,6 +138,22 @@ public: return should_do_colors_; } + void set_color_mode(color_mode mode) + { + switch (mode) + { + case color_mode::always: + should_do_colors_ = true; + return; + case color_mode::automatic: + should_do_colors_ = details::os::in_terminal(target_file_) && details::os::is_color_terminal(); + return; + case color_mode::never: + should_do_colors_ = false; + return; + } + } + private: void print_ccode_(const std::string &color_code) { diff --git a/include/spdlog/sinks/stdout_color_sinks.h b/include/spdlog/sinks/stdout_color_sinks.h index 5accda44..89271666 100644 --- a/include/spdlog/sinks/stdout_color_sinks.h +++ b/include/spdlog/sinks/stdout_color_sinks.h @@ -31,26 +31,26 @@ using stderr_color_sink_st = ansicolor_stderr_sink_st; } // namespace sinks template -inline std::shared_ptr stdout_color_mt(const std::string &logger_name) +inline std::shared_ptr stdout_color_mt(const std::string &logger_name, color_mode mode = color_mode::automatic) { - return Factory::template create(logger_name); + return Factory::template create(logger_name, mode); } template -inline std::shared_ptr stdout_color_st(const std::string &logger_name) +inline std::shared_ptr stdout_color_st(const std::string &logger_name, color_mode mode = color_mode::automatic) { - return Factory::template create(logger_name); + return Factory::template create(logger_name, mode); } template -inline std::shared_ptr stderr_color_mt(const std::string &logger_name) +inline std::shared_ptr stderr_color_mt(const std::string &logger_name, color_mode mode = color_mode::automatic) { - return Factory::template create(logger_name); + return Factory::template create(logger_name, mode); } template -inline std::shared_ptr stderr_color_st(const std::string &logger_name) +inline std::shared_ptr stderr_color_st(const std::string &logger_name, color_mode mode = color_mode::automatic) { - return Factory::template create(logger_name); + return Factory::template create(logger_name, mode); } } // namespace spdlog diff --git a/include/spdlog/sinks/wincolor_sink.h b/include/spdlog/sinks/wincolor_sink.h index 1fdf8c56..2ee3efd7 100644 --- a/include/spdlog/sinks/wincolor_sink.h +++ b/include/spdlog/sinks/wincolor_sink.h @@ -37,10 +37,11 @@ public: const WORD WHITE = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; const WORD YELLOW = FOREGROUND_RED | FOREGROUND_GREEN; - wincolor_sink() + wincolor_sink(color_mode mode = color_mode::automatic) : out_handle_(OutHandle::handle()) , mutex_(ConsoleMutex::mutex()) { + set_color_mode(mode); colors_[level::trace] = WHITE; colors_[level::debug] = CYAN; colors_[level::info] = GREEN; @@ -70,7 +71,7 @@ public: std::lock_guard lock(mutex_); fmt::memory_buffer formatted; formatter_->format(msg, formatted); - if (msg.color_range_end > msg.color_range_start) + if (should_do_colors_ && msg.color_range_end > msg.color_range_start) { // before color range print_range_(formatted, 0, msg.color_range_start); @@ -83,7 +84,7 @@ public: // after color range print_range_(formatted, msg.color_range_end, formatted.size()); } - else // print without colors if color range is invalid + else // print without colors if color range is invalid (or color is disabled) { print_range_(formatted, 0, formatted.size()); } @@ -106,6 +107,20 @@ public: formatter_ = std::move(sink_formatter); } + void set_color_mode(color_mode mode) + { + switch (mode) + { + case color_mode::always: + case color_mode::automatic: + should_do_colors_ = true; + return; + case color_mode::never: + should_do_colors_ = false; + return; + } + } + private: using mutex_t = typename ConsoleMutex::mutex_t; // set color and return the orig console attributes (for resetting later) @@ -130,6 +145,7 @@ private: HANDLE out_handle_; mutex_t &mutex_; + bool should_do_colors_; std::unordered_map colors_; }; From 3ce9ac74a66cc19c652655c8c3aea526612820d2 Mon Sep 17 00:00:00 2001 From: gabime Date: Fri, 10 May 2019 17:41:21 +0300 Subject: [PATCH 37/39] Mutex protect set_color_mode() --- include/spdlog/sinks/ansicolor_sink.h | 16 +++++++++++----- include/spdlog/sinks/wincolor_sink.h | 17 ++++++++++++----- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/include/spdlog/sinks/ansicolor_sink.h b/include/spdlog/sinks/ansicolor_sink.h index 3563e7b6..905d270a 100644 --- a/include/spdlog/sinks/ansicolor_sink.h +++ b/include/spdlog/sinks/ansicolor_sink.h @@ -38,7 +38,7 @@ public: , mutex_(ConsoleMutex::mutex()) { - set_color_mode(mode); + set_color_mode_(mode); colors_[level::trace] = white; colors_[level::debug] = cyan; colors_[level::info] = green; @@ -139,22 +139,28 @@ public: } void set_color_mode(color_mode mode) + { + std::lock_guard lock(mutex_); + set_color_mode_(mode); + } + +private: + void set_color_mode_(color_mode mode) { switch (mode) { case color_mode::always: should_do_colors_ = true; - return; + break; case color_mode::automatic: should_do_colors_ = details::os::in_terminal(target_file_) && details::os::is_color_terminal(); - return; + break; case color_mode::never: should_do_colors_ = false; - return; + break; } } -private: void print_ccode_(const std::string &color_code) { fwrite(color_code.data(), sizeof(char), color_code.size(), target_file_); diff --git a/include/spdlog/sinks/wincolor_sink.h b/include/spdlog/sinks/wincolor_sink.h index 2ee3efd7..3c248192 100644 --- a/include/spdlog/sinks/wincolor_sink.h +++ b/include/spdlog/sinks/wincolor_sink.h @@ -41,7 +41,7 @@ public: : out_handle_(OutHandle::handle()) , mutex_(ConsoleMutex::mutex()) { - set_color_mode(mode); + set_color_mode_(mode); colors_[level::trace] = WHITE; colors_[level::debug] = CYAN; colors_[level::info] = GREEN; @@ -108,21 +108,28 @@ public: } void set_color_mode(color_mode mode) + { + std::lock_guard lock(mutex_); + set_color_mode_(mode); + } + +private: + using mutex_t = typename ConsoleMutex::mutex_t; + + void set_color_mode_(color_mode mode) { switch (mode) { case color_mode::always: case color_mode::automatic: should_do_colors_ = true; - return; + break case color_mode::never: should_do_colors_ = false; - return; + break } } -private: - using mutex_t = typename ConsoleMutex::mutex_t; // set color and return the orig console attributes (for resetting later) WORD set_console_attribs(WORD attribs) { From e504aceeb5734568000f344540fc72b6be932c69 Mon Sep 17 00:00:00 2001 From: Gabi Melman Date: Fri, 10 May 2019 17:59:48 +0300 Subject: [PATCH 38/39] Update wincolor_sink.h --- include/spdlog/sinks/wincolor_sink.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/spdlog/sinks/wincolor_sink.h b/include/spdlog/sinks/wincolor_sink.h index 3c248192..7c51014b 100644 --- a/include/spdlog/sinks/wincolor_sink.h +++ b/include/spdlog/sinks/wincolor_sink.h @@ -123,10 +123,10 @@ private: case color_mode::always: case color_mode::automatic: should_do_colors_ = true; - break + break; case color_mode::never: should_do_colors_ = false; - break + break; } } From 74dbf4cf702b49c98642c9afe74d114a238a6a07 Mon Sep 17 00:00:00 2001 From: gabime Date: Fri, 10 May 2019 18:46:13 +0300 Subject: [PATCH 39/39] mutex protect should_color() --- include/spdlog/sinks/ansicolor_sink.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/spdlog/sinks/ansicolor_sink.h b/include/spdlog/sinks/ansicolor_sink.h index 905d270a..3fbbf27b 100644 --- a/include/spdlog/sinks/ansicolor_sink.h +++ b/include/spdlog/sinks/ansicolor_sink.h @@ -135,6 +135,7 @@ public: bool should_color() { + std::lock_guard lock(mutex_); return should_do_colors_; }