From e97621d61d211c256c915b9f85caca5aa43d7305 Mon Sep 17 00:00:00 2001 From: gabime Date: Sun, 18 Sep 2016 00:43:42 +0300 Subject: [PATCH] Removed force_flush arg from everywhere. Use flush_on(level) instead --- include/spdlog/details/file_helper.h | 13 +++------ include/spdlog/details/spdlog_impl.h | 4 +-- include/spdlog/sinks/file_sinks.h | 40 ++++++++++++---------------- tests/errors.cpp | 1 + tests/file_helper.cpp | 11 ++++---- tests/file_log.cpp | 35 +++++++++++++++++------- 6 files changed, 56 insertions(+), 48 deletions(-) diff --git a/include/spdlog/details/file_helper.h b/include/spdlog/details/file_helper.h index 37f1cf27..2e6ce9d2 100644 --- a/include/spdlog/details/file_helper.h +++ b/include/spdlog/details/file_helper.h @@ -31,9 +31,8 @@ public: const int open_tries = 5; const int open_interval = 10; - explicit file_helper(bool force_flush) : - _fd(nullptr), - _force_flush(force_flush) + explicit file_helper() : + _fd(nullptr) {} file_helper(const file_helper&) = delete; @@ -90,10 +89,7 @@ public: size_t msg_size = msg.formatted.size(); auto data = msg.formatted.data(); if (std::fwrite(data, 1, msg_size, _fd) != msg_size) - throw spdlog_ex("Failed writing to file " + os::filename_to_str(_filename), errno); - - if (_force_flush) - std::fflush(_fd); + throw spdlog_ex("Failed writing to file " + os::filename_to_str(_filename), errno); } size_t size() @@ -116,8 +112,7 @@ public: private: FILE* _fd; - filename_t _filename; - bool _force_flush; + filename_t _filename; }; } } diff --git a/include/spdlog/details/spdlog_impl.h b/include/spdlog/details/spdlog_impl.h index 95aeeb07..bc283c83 100644 --- a/include/spdlog/details/spdlog_impl.h +++ b/include/spdlog/details/spdlog_impl.h @@ -39,12 +39,12 @@ inline void spdlog::drop(const std::string &name) // Create multi/single threaded simple file logger inline std::shared_ptr spdlog::basic_logger_mt(const std::string& logger_name, const filename_t& filename, bool truncate) { - return create(logger_name, filename, false, truncate); + return create(logger_name, filename, truncate); } inline std::shared_ptr spdlog::basic_logger_st(const std::string& logger_name, const filename_t& filename, bool truncate) { - return create(logger_name, filename, false, truncate); + return create(logger_name, filename, truncate); } // Create multi/single threaded rotating file logger diff --git a/include/spdlog/sinks/file_sinks.h b/include/spdlog/sinks/file_sinks.h index ff767593..fad21fe1 100644 --- a/include/spdlog/sinks/file_sinks.h +++ b/include/spdlog/sinks/file_sinks.h @@ -23,16 +23,13 @@ namespace spdlog namespace sinks { /* -* Trivial file sink with single file as target -*/ + * Trivial file sink with single file as target + */ template class simple_file_sink : public base_sink < Mutex > { public: - explicit simple_file_sink(const filename_t &filename, - bool force_flush = false, - bool truncate = false) : - _file_helper(force_flush) + explicit simple_file_sink(const filename_t &filename, bool truncate = false) { _file_helper.open(filename, truncate); } @@ -54,21 +51,20 @@ typedef simple_file_sink simple_file_sink_mt; typedef simple_file_sink simple_file_sink_st; /* -* Rotating file sink based on size -*/ + * Rotating file sink based on size + */ template class rotating_file_sink : public base_sink < Mutex > { public: rotating_file_sink(const filename_t &base_filename, const filename_t &extension, - std::size_t max_size, std::size_t max_files, - bool force_flush = false) : + std::size_t max_size, std::size_t max_files ) : _base_filename(base_filename), _extension(extension), _max_size(max_size), _max_files(max_files), _current_size(0), - _file_helper(force_flush) + _file_helper() { _file_helper.open(calc_filename(_base_filename, 0, _extension)); _current_size = _file_helper.size(); //expensive. called only once @@ -143,11 +139,11 @@ typedef rotating_file_sink rotating_file_sink_mt; typedef rotating_file_sinkrotating_file_sink_st; /* -* Default generator of daily log file names. -*/ + * Default generator of daily log file names. + */ struct default_daily_file_name_calculator { - //Create filename for the form basename.YYYY-MM-DD_hh-mm.extension + // Create filename for the form basename.YYYY-MM-DD_hh-mm.extension static filename_t calc_filename(const filename_t& basename, const filename_t& extension) { std::tm tm = spdlog::details::os::localtime(); @@ -158,11 +154,11 @@ struct default_daily_file_name_calculator }; /* -* Generator of daily log file names in format basename.YYYY-MM-DD.extension -*/ + * Generator of daily log file names in format basename.YYYY-MM-DD.extension + */ struct dateonly_daily_file_name_calculator { - //Create filename for the form basename.YYYY-MM-DD.extension + // Create filename for the form basename.YYYY-MM-DD.extension static filename_t calc_filename(const filename_t& basename, const filename_t& extension) { std::tm tm = spdlog::details::os::localtime(); @@ -173,8 +169,8 @@ struct dateonly_daily_file_name_calculator }; /* -* Rotating file sink based on date. rotates at midnight -*/ + * Rotating file sink based on date. rotates at midnight + */ template class daily_file_sink :public base_sink < Mutex > { @@ -184,12 +180,10 @@ public: const filename_t& base_filename, const filename_t& extension, int rotation_hour, - int rotation_minute, - bool force_flush = false) : _base_filename(base_filename), + int rotation_minute) : _base_filename(base_filename), _extension(extension), _rotation_h(rotation_hour), - _rotation_m(rotation_minute), - _file_helper(force_flush) + _rotation_m(rotation_minute) { if (rotation_hour < 0 || rotation_hour > 23 || rotation_minute < 0 || rotation_minute > 59) throw spdlog_ex("daily_file_sink: Invalid rotation time in ctor"); diff --git a/tests/errors.cpp b/tests/errors.cpp index 6cb4265e..04cd97c2 100644 --- a/tests/errors.cpp +++ b/tests/errors.cpp @@ -28,6 +28,7 @@ TEST_CASE("custom_error_handler", "[errors]]") prepare_logdir(); std::string filename = "logs/simple_log.txt"; auto logger = spdlog::create("logger", filename, true); + logger->flush_on(spdlog::level::info); logger->set_error_handler([=](const std::string& msg) { throw custom_ex(); diff --git a/tests/file_helper.cpp b/tests/file_helper.cpp index 54d54cf1..599c233f 100644 --- a/tests/file_helper.cpp +++ b/tests/file_helper.cpp @@ -12,6 +12,7 @@ static void write_with_helper(file_helper &helper, size_t howmany) log_msg msg; msg.formatted << std::string(howmany, '1'); helper.write(msg); + helper.flush(); } @@ -19,7 +20,7 @@ TEST_CASE("file_helper_filename", "[file_helper::filename()]]") { prepare_logdir(); - file_helper helper(false); + file_helper helper; helper.open(target_filename); REQUIRE(helper.filename() == target_filename); } @@ -31,7 +32,7 @@ TEST_CASE("file_helper_size", "[file_helper::size()]]") prepare_logdir(); size_t expected_size = 123; { - file_helper helper(true); + file_helper helper; helper.open(target_filename); write_with_helper(helper, expected_size); REQUIRE(static_cast(helper.size()) == expected_size); @@ -44,7 +45,7 @@ TEST_CASE("file_helper_exists", "[file_helper::file_exists()]]") { prepare_logdir(); REQUIRE(!file_helper::file_exists(target_filename)); - file_helper helper(false); + file_helper helper; helper.open(target_filename); REQUIRE(file_helper::file_exists(target_filename)); } @@ -52,7 +53,7 @@ TEST_CASE("file_helper_exists", "[file_helper::file_exists()]]") TEST_CASE("file_helper_reopen", "[file_helper::reopen()]]") { prepare_logdir(); - file_helper helper(true); + file_helper helper; helper.open(target_filename); write_with_helper(helper, 12); REQUIRE(helper.size() == 12); @@ -64,7 +65,7 @@ TEST_CASE("file_helper_reopen2", "[file_helper::reopen(false)]]") { prepare_logdir(); size_t expected_size = 14; - file_helper helper(true); + file_helper helper; helper.open(target_filename); write_with_helper(helper, expected_size); REQUIRE(helper.size() == expected_size); diff --git a/tests/file_log.cpp b/tests/file_log.cpp index bc5da728..ab1d9432 100644 --- a/tests/file_log.cpp +++ b/tests/file_log.cpp @@ -18,7 +18,26 @@ TEST_CASE("simple_file_logger", "[simple_logger]]") logger->flush(); REQUIRE(file_contents(filename) == std::string("Test message 1\nTest message 2\n")); REQUIRE(count_lines(filename) == 2); +} + +TEST_CASE("flush_on", "[flush_on]]") +{ + prepare_logdir(); + std::string filename = "logs/simple_log.txt"; + + auto logger = spdlog::create("logger", filename); + logger->set_pattern("%v"); + logger->set_level(spdlog::level::trace); + logger->flush_on(spdlog::level::info); + logger->trace("Should not be flushed"); + REQUIRE(count_lines(filename) == 0); + + logger->info("Test message {}", 1); + logger->info("Test message {}", 2); + logger->flush(); + REQUIRE(file_contents(filename) == std::string("Should not be flushed\nTest message 1\nTest message 2\n")); + REQUIRE(count_lines(filename) == 3); } TEST_CASE("rotating_file_logger1", "[rotating_logger]]") @@ -26,15 +45,13 @@ TEST_CASE("rotating_file_logger1", "[rotating_logger]]") prepare_logdir(); std::string basename = "logs/rotating_log"; auto logger = spdlog::rotating_logger_mt("logger", basename, 1024, 0); - logger->flush_on(spdlog::level::info); + for (int i = 0; i < 10; ++i) logger->info("Test message {}", i); + logger->flush(); auto filename = basename + ".txt"; REQUIRE(count_lines(filename) == 10); - for (int i = 0; i < 1000; i++) - logger->info("Test message {}", i); - } @@ -61,7 +78,6 @@ TEST_CASE("rotating_file_logger2", "[rotating_logger]]") TEST_CASE("daily_logger", "[daily_logger]]") { - prepare_logdir(); //calculate filename (time based) std::string basename = "logs/daily_log"; @@ -92,10 +108,10 @@ TEST_CASE("daily_logger with dateonly calculator", "[daily_logger_dateonly]]") fmt::MemoryWriter w; w.write("{}_{:04d}-{:02d}-{:02d}.txt", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); - auto logger = spdlog::create("logger", basename, "txt", 0, 0, true); + auto logger = spdlog::create("logger", basename, "txt", 0, 0); for (int i = 0; i < 10; ++i) logger->info("Test message {}", i); - + logger->flush(); auto filename = w.str(); REQUIRE(count_lines(filename) == 10); } @@ -124,11 +140,12 @@ TEST_CASE("daily_logger with custom calculator", "[daily_logger_custom]]") fmt::MemoryWriter w; w.write("{}{:04d}{:02d}{:02d}.txt", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); - auto logger = spdlog::create("logger", basename, "txt", 0, 0, true); + auto logger = spdlog::create("logger", basename, "txt", 0, 0); for (int i = 0; i < 10; ++i) logger->info("Test message {}", i); - auto filename = w.str(); + logger->flush(); + auto filename = w.str(); REQUIRE(count_lines(filename) == 10); }