mirror of
https://github.com/gabime/spdlog.git
synced 2025-03-31 02:12:40 +08:00
Removed force_flush arg from everywhere. Use flush_on(level) instead
This commit is contained in:
parent
b0f8230783
commit
e97621d61d
@ -31,9 +31,8 @@ public:
|
|||||||
const int open_tries = 5;
|
const int open_tries = 5;
|
||||||
const int open_interval = 10;
|
const int open_interval = 10;
|
||||||
|
|
||||||
explicit file_helper(bool force_flush) :
|
explicit file_helper() :
|
||||||
_fd(nullptr),
|
_fd(nullptr)
|
||||||
_force_flush(force_flush)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
file_helper(const file_helper&) = delete;
|
file_helper(const file_helper&) = delete;
|
||||||
@ -90,10 +89,7 @@ public:
|
|||||||
size_t msg_size = msg.formatted.size();
|
size_t msg_size = msg.formatted.size();
|
||||||
auto data = msg.formatted.data();
|
auto data = msg.formatted.data();
|
||||||
if (std::fwrite(data, 1, msg_size, _fd) != msg_size)
|
if (std::fwrite(data, 1, msg_size, _fd) != msg_size)
|
||||||
throw spdlog_ex("Failed writing to file " + os::filename_to_str(_filename), errno);
|
throw spdlog_ex("Failed writing to file " + os::filename_to_str(_filename), errno);
|
||||||
|
|
||||||
if (_force_flush)
|
|
||||||
std::fflush(_fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t size()
|
size_t size()
|
||||||
@ -116,8 +112,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
FILE* _fd;
|
FILE* _fd;
|
||||||
filename_t _filename;
|
filename_t _filename;
|
||||||
bool _force_flush;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,12 +39,12 @@ inline void spdlog::drop(const std::string &name)
|
|||||||
// Create multi/single threaded simple file logger
|
// Create multi/single threaded simple file logger
|
||||||
inline std::shared_ptr<spdlog::logger> spdlog::basic_logger_mt(const std::string& logger_name, const filename_t& filename, bool truncate)
|
inline std::shared_ptr<spdlog::logger> spdlog::basic_logger_mt(const std::string& logger_name, const filename_t& filename, bool truncate)
|
||||||
{
|
{
|
||||||
return create<spdlog::sinks::simple_file_sink_mt>(logger_name, filename, false, truncate);
|
return create<spdlog::sinks::simple_file_sink_mt>(logger_name, filename, truncate);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::shared_ptr<spdlog::logger> spdlog::basic_logger_st(const std::string& logger_name, const filename_t& filename, bool truncate)
|
inline std::shared_ptr<spdlog::logger> spdlog::basic_logger_st(const std::string& logger_name, const filename_t& filename, bool truncate)
|
||||||
{
|
{
|
||||||
return create<spdlog::sinks::simple_file_sink_st>(logger_name, filename, false, truncate);
|
return create<spdlog::sinks::simple_file_sink_st>(logger_name, filename, truncate);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create multi/single threaded rotating file logger
|
// Create multi/single threaded rotating file logger
|
||||||
|
@ -23,16 +23,13 @@ namespace spdlog
|
|||||||
namespace sinks
|
namespace sinks
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Trivial file sink with single file as target
|
* Trivial file sink with single file as target
|
||||||
*/
|
*/
|
||||||
template<class Mutex>
|
template<class Mutex>
|
||||||
class simple_file_sink : public base_sink < Mutex >
|
class simple_file_sink : public base_sink < Mutex >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit simple_file_sink(const filename_t &filename,
|
explicit simple_file_sink(const filename_t &filename, bool truncate = false)
|
||||||
bool force_flush = false,
|
|
||||||
bool truncate = false) :
|
|
||||||
_file_helper(force_flush)
|
|
||||||
{
|
{
|
||||||
_file_helper.open(filename, truncate);
|
_file_helper.open(filename, truncate);
|
||||||
}
|
}
|
||||||
@ -54,21 +51,20 @@ typedef simple_file_sink<std::mutex> simple_file_sink_mt;
|
|||||||
typedef simple_file_sink<details::null_mutex> simple_file_sink_st;
|
typedef simple_file_sink<details::null_mutex> simple_file_sink_st;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Rotating file sink based on size
|
* Rotating file sink based on size
|
||||||
*/
|
*/
|
||||||
template<class Mutex>
|
template<class Mutex>
|
||||||
class rotating_file_sink : public base_sink < Mutex >
|
class rotating_file_sink : public base_sink < Mutex >
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
rotating_file_sink(const filename_t &base_filename, const filename_t &extension,
|
rotating_file_sink(const filename_t &base_filename, const filename_t &extension,
|
||||||
std::size_t max_size, std::size_t max_files,
|
std::size_t max_size, std::size_t max_files ) :
|
||||||
bool force_flush = false) :
|
|
||||||
_base_filename(base_filename),
|
_base_filename(base_filename),
|
||||||
_extension(extension),
|
_extension(extension),
|
||||||
_max_size(max_size),
|
_max_size(max_size),
|
||||||
_max_files(max_files),
|
_max_files(max_files),
|
||||||
_current_size(0),
|
_current_size(0),
|
||||||
_file_helper(force_flush)
|
_file_helper()
|
||||||
{
|
{
|
||||||
_file_helper.open(calc_filename(_base_filename, 0, _extension));
|
_file_helper.open(calc_filename(_base_filename, 0, _extension));
|
||||||
_current_size = _file_helper.size(); //expensive. called only once
|
_current_size = _file_helper.size(); //expensive. called only once
|
||||||
@ -143,11 +139,11 @@ typedef rotating_file_sink<std::mutex> rotating_file_sink_mt;
|
|||||||
typedef rotating_file_sink<details::null_mutex>rotating_file_sink_st;
|
typedef rotating_file_sink<details::null_mutex>rotating_file_sink_st;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Default generator of daily log file names.
|
* Default generator of daily log file names.
|
||||||
*/
|
*/
|
||||||
struct default_daily_file_name_calculator
|
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)
|
static filename_t calc_filename(const filename_t& basename, const filename_t& extension)
|
||||||
{
|
{
|
||||||
std::tm tm = spdlog::details::os::localtime();
|
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
|
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)
|
static filename_t calc_filename(const filename_t& basename, const filename_t& extension)
|
||||||
{
|
{
|
||||||
std::tm tm = spdlog::details::os::localtime();
|
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 Mutex, class FileNameCalc = default_daily_file_name_calculator>
|
template<class Mutex, class FileNameCalc = default_daily_file_name_calculator>
|
||||||
class daily_file_sink :public base_sink < Mutex >
|
class daily_file_sink :public base_sink < Mutex >
|
||||||
{
|
{
|
||||||
@ -184,12 +180,10 @@ public:
|
|||||||
const filename_t& base_filename,
|
const filename_t& base_filename,
|
||||||
const filename_t& extension,
|
const filename_t& extension,
|
||||||
int rotation_hour,
|
int rotation_hour,
|
||||||
int rotation_minute,
|
int rotation_minute) : _base_filename(base_filename),
|
||||||
bool force_flush = false) : _base_filename(base_filename),
|
|
||||||
_extension(extension),
|
_extension(extension),
|
||||||
_rotation_h(rotation_hour),
|
_rotation_h(rotation_hour),
|
||||||
_rotation_m(rotation_minute),
|
_rotation_m(rotation_minute)
|
||||||
_file_helper(force_flush)
|
|
||||||
{
|
{
|
||||||
if (rotation_hour < 0 || rotation_hour > 23 || rotation_minute < 0 || rotation_minute > 59)
|
if (rotation_hour < 0 || rotation_hour > 23 || rotation_minute < 0 || rotation_minute > 59)
|
||||||
throw spdlog_ex("daily_file_sink: Invalid rotation time in ctor");
|
throw spdlog_ex("daily_file_sink: Invalid rotation time in ctor");
|
||||||
|
@ -28,6 +28,7 @@ TEST_CASE("custom_error_handler", "[errors]]")
|
|||||||
prepare_logdir();
|
prepare_logdir();
|
||||||
std::string filename = "logs/simple_log.txt";
|
std::string filename = "logs/simple_log.txt";
|
||||||
auto logger = spdlog::create<spdlog::sinks::simple_file_sink_mt>("logger", filename, true);
|
auto logger = spdlog::create<spdlog::sinks::simple_file_sink_mt>("logger", filename, true);
|
||||||
|
logger->flush_on(spdlog::level::info);
|
||||||
logger->set_error_handler([=](const std::string& msg)
|
logger->set_error_handler([=](const std::string& msg)
|
||||||
{
|
{
|
||||||
throw custom_ex();
|
throw custom_ex();
|
||||||
|
@ -12,6 +12,7 @@ static void write_with_helper(file_helper &helper, size_t howmany)
|
|||||||
log_msg msg;
|
log_msg msg;
|
||||||
msg.formatted << std::string(howmany, '1');
|
msg.formatted << std::string(howmany, '1');
|
||||||
helper.write(msg);
|
helper.write(msg);
|
||||||
|
helper.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -19,7 +20,7 @@ TEST_CASE("file_helper_filename", "[file_helper::filename()]]")
|
|||||||
{
|
{
|
||||||
prepare_logdir();
|
prepare_logdir();
|
||||||
|
|
||||||
file_helper helper(false);
|
file_helper helper;
|
||||||
helper.open(target_filename);
|
helper.open(target_filename);
|
||||||
REQUIRE(helper.filename() == target_filename);
|
REQUIRE(helper.filename() == target_filename);
|
||||||
}
|
}
|
||||||
@ -31,7 +32,7 @@ TEST_CASE("file_helper_size", "[file_helper::size()]]")
|
|||||||
prepare_logdir();
|
prepare_logdir();
|
||||||
size_t expected_size = 123;
|
size_t expected_size = 123;
|
||||||
{
|
{
|
||||||
file_helper helper(true);
|
file_helper helper;
|
||||||
helper.open(target_filename);
|
helper.open(target_filename);
|
||||||
write_with_helper(helper, expected_size);
|
write_with_helper(helper, expected_size);
|
||||||
REQUIRE(static_cast<size_t>(helper.size()) == expected_size);
|
REQUIRE(static_cast<size_t>(helper.size()) == expected_size);
|
||||||
@ -44,7 +45,7 @@ TEST_CASE("file_helper_exists", "[file_helper::file_exists()]]")
|
|||||||
{
|
{
|
||||||
prepare_logdir();
|
prepare_logdir();
|
||||||
REQUIRE(!file_helper::file_exists(target_filename));
|
REQUIRE(!file_helper::file_exists(target_filename));
|
||||||
file_helper helper(false);
|
file_helper helper;
|
||||||
helper.open(target_filename);
|
helper.open(target_filename);
|
||||||
REQUIRE(file_helper::file_exists(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()]]")
|
TEST_CASE("file_helper_reopen", "[file_helper::reopen()]]")
|
||||||
{
|
{
|
||||||
prepare_logdir();
|
prepare_logdir();
|
||||||
file_helper helper(true);
|
file_helper helper;
|
||||||
helper.open(target_filename);
|
helper.open(target_filename);
|
||||||
write_with_helper(helper, 12);
|
write_with_helper(helper, 12);
|
||||||
REQUIRE(helper.size() == 12);
|
REQUIRE(helper.size() == 12);
|
||||||
@ -64,7 +65,7 @@ TEST_CASE("file_helper_reopen2", "[file_helper::reopen(false)]]")
|
|||||||
{
|
{
|
||||||
prepare_logdir();
|
prepare_logdir();
|
||||||
size_t expected_size = 14;
|
size_t expected_size = 14;
|
||||||
file_helper helper(true);
|
file_helper helper;
|
||||||
helper.open(target_filename);
|
helper.open(target_filename);
|
||||||
write_with_helper(helper, expected_size);
|
write_with_helper(helper, expected_size);
|
||||||
REQUIRE(helper.size() == expected_size);
|
REQUIRE(helper.size() == expected_size);
|
||||||
|
@ -18,7 +18,26 @@ TEST_CASE("simple_file_logger", "[simple_logger]]")
|
|||||||
logger->flush();
|
logger->flush();
|
||||||
REQUIRE(file_contents(filename) == std::string("Test message 1\nTest message 2\n"));
|
REQUIRE(file_contents(filename) == std::string("Test message 1\nTest message 2\n"));
|
||||||
REQUIRE(count_lines(filename) == 2);
|
REQUIRE(count_lines(filename) == 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_CASE("flush_on", "[flush_on]]")
|
||||||
|
{
|
||||||
|
prepare_logdir();
|
||||||
|
std::string filename = "logs/simple_log.txt";
|
||||||
|
|
||||||
|
auto logger = spdlog::create<spdlog::sinks::simple_file_sink_mt>("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]]")
|
TEST_CASE("rotating_file_logger1", "[rotating_logger]]")
|
||||||
@ -26,15 +45,13 @@ TEST_CASE("rotating_file_logger1", "[rotating_logger]]")
|
|||||||
prepare_logdir();
|
prepare_logdir();
|
||||||
std::string basename = "logs/rotating_log";
|
std::string basename = "logs/rotating_log";
|
||||||
auto logger = spdlog::rotating_logger_mt("logger", basename, 1024, 0);
|
auto logger = spdlog::rotating_logger_mt("logger", basename, 1024, 0);
|
||||||
logger->flush_on(spdlog::level::info);
|
|
||||||
for (int i = 0; i < 10; ++i)
|
for (int i = 0; i < 10; ++i)
|
||||||
logger->info("Test message {}", i);
|
logger->info("Test message {}", i);
|
||||||
|
|
||||||
|
logger->flush();
|
||||||
auto filename = basename + ".txt";
|
auto filename = basename + ".txt";
|
||||||
REQUIRE(count_lines(filename) == 10);
|
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]]")
|
TEST_CASE("daily_logger", "[daily_logger]]")
|
||||||
{
|
{
|
||||||
|
|
||||||
prepare_logdir();
|
prepare_logdir();
|
||||||
//calculate filename (time based)
|
//calculate filename (time based)
|
||||||
std::string basename = "logs/daily_log";
|
std::string basename = "logs/daily_log";
|
||||||
@ -92,10 +108,10 @@ TEST_CASE("daily_logger with dateonly calculator", "[daily_logger_dateonly]]")
|
|||||||
fmt::MemoryWriter w;
|
fmt::MemoryWriter w;
|
||||||
w.write("{}_{:04d}-{:02d}-{:02d}.txt", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
|
w.write("{}_{:04d}-{:02d}-{:02d}.txt", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
|
||||||
|
|
||||||
auto logger = spdlog::create<sink_type>("logger", basename, "txt", 0, 0, true);
|
auto logger = spdlog::create<sink_type>("logger", basename, "txt", 0, 0);
|
||||||
for (int i = 0; i < 10; ++i)
|
for (int i = 0; i < 10; ++i)
|
||||||
logger->info("Test message {}", i);
|
logger->info("Test message {}", i);
|
||||||
|
logger->flush();
|
||||||
auto filename = w.str();
|
auto filename = w.str();
|
||||||
REQUIRE(count_lines(filename) == 10);
|
REQUIRE(count_lines(filename) == 10);
|
||||||
}
|
}
|
||||||
@ -124,11 +140,12 @@ TEST_CASE("daily_logger with custom calculator", "[daily_logger_custom]]")
|
|||||||
fmt::MemoryWriter w;
|
fmt::MemoryWriter w;
|
||||||
w.write("{}{:04d}{:02d}{:02d}.txt", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
|
w.write("{}{:04d}{:02d}{:02d}.txt", basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
|
||||||
|
|
||||||
auto logger = spdlog::create<sink_type>("logger", basename, "txt", 0, 0, true);
|
auto logger = spdlog::create<sink_type>("logger", basename, "txt", 0, 0);
|
||||||
for (int i = 0; i < 10; ++i)
|
for (int i = 0; i < 10; ++i)
|
||||||
logger->info("Test message {}", i);
|
logger->info("Test message {}", i);
|
||||||
|
|
||||||
auto filename = w.str();
|
logger->flush();
|
||||||
|
auto filename = w.str();
|
||||||
REQUIRE(count_lines(filename) == 10);
|
REQUIRE(count_lines(filename) == 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user