spdlog
Loading...
Searching...
No Matches
test_daily_logger.cpp
Go to the documentation of this file.
1/*
2 * This content is released under the MIT License as specified in https://raw.githubusercontent.com/gabime/spdlog/master/LICENSE
3 */
4#include "includes.h"
5
6using filename_memory_buf_t = fmt::basic_memory_buffer<spdlog::filename_t::value_type, 250>;
7
8TEST_CASE("daily_logger with dateonly calculator", "[daily_logger]")
9{
11
13
14 // calculate filename (time based)
15 spdlog::filename_t basename = SPDLOG_FILENAME_T("test_logs/daily_dateonly");
18 fmt::format_to(
19 std::back_inserter(w), SPDLOG_FILENAME_T("{}_{:04d}-{:02d}-{:02d}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
20
21 auto logger = spdlog::create<sink_type>("logger", basename, 0, 0);
22 for (int i = 0; i < 10; ++i)
23 {
24
25 logger->info("Test message {}", i);
26 }
27 logger->flush();
28
29#ifdef SPDLOG_WCHAR_FILENAMES
31 spdlog::details::os::wstr_to_utf8buf(fmt::to_string(w), buf);
32 auto filename = fmt::to_string(buf);
33#else
34 auto filename = fmt::to_string(w);
35#endif
36 require_message_count(filename, 10);
37}
38
40{
41 static spdlog::filename_t calc_filename(const spdlog::filename_t &basename, const tm &now_tm)
42 {
44 fmt::format_to(std::back_inserter(w), SPDLOG_FILENAME_T("{}{:04d}{:02d}{:02d}"), basename, now_tm.tm_year + 1900, now_tm.tm_mon + 1,
45 now_tm.tm_mday);
46 return fmt::to_string(w);
47 }
48};
49
50TEST_CASE("daily_logger with custom calculator", "[daily_logger]")
51{
53
55
56 // calculate filename (time based)
57 spdlog::filename_t basename = SPDLOG_FILENAME_T("test_logs/daily_dateonly");
60 fmt::format_to(
61 std::back_inserter(w), SPDLOG_FILENAME_T("{}{:04d}{:02d}{:02d}"), basename, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
62
63 auto logger = spdlog::create<sink_type>("logger", basename, 0, 0);
64 for (int i = 0; i < 10; ++i)
65 {
66 logger->info("Test message {}", i);
67 }
68
69 logger->flush();
70
71#ifdef SPDLOG_WCHAR_FILENAMES
73 spdlog::details::os::wstr_to_utf8buf(fmt::to_string(w), buf);
74 auto filename = fmt::to_string(buf);
75#else
76 auto filename = fmt::to_string(w);
77#endif
78 require_message_count(filename, 10);
79}
80
81/*
82 * File name calculations
83 */
84
85TEST_CASE("rotating_file_sink::calc_filename1", "[rotating_file_sink]]")
86{
88 REQUIRE(filename == SPDLOG_FILENAME_T("rotated.3.txt"));
89}
90
91TEST_CASE("rotating_file_sink::calc_filename2", "[rotating_file_sink]]")
92{
94 REQUIRE(filename == SPDLOG_FILENAME_T("rotated.3"));
95}
96
97TEST_CASE("rotating_file_sink::calc_filename3", "[rotating_file_sink]]")
98{
100 REQUIRE(filename == SPDLOG_FILENAME_T("rotated.txt"));
101}
102
103// regex supported only from gcc 4.9 and above
104#if defined(_MSC_VER) || !(__GNUC__ <= 4 && __GNUC_MINOR__ < 9)
105
106# include <regex>
107
108TEST_CASE("daily_file_sink::daily_filename_calculator", "[daily_file_sink]]")
109{
110 // daily_YYYY-MM-DD_hh-mm.txt
111 auto filename =
113 // date regex based on https://www.regular-expressions.info/dates.html
115 SPDLOG_FILENAME_T(R"(^daily_(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])\.txt$)"));
117 REQUIRE(std::regex_match(filename, match, re));
118}
119#endif
120
121/* Test removal of old files */
123{
124 using spdlog::log_clock;
125 spdlog::details::log_msg msg{"test", spdlog::level::info, "Hello Message"};
126 msg.time = log_clock::now() + offset;
127 return msg;
128}
129
130static void test_rotate(int days_to_run, uint16_t max_days, uint16_t expected_n_files)
131{
132 using spdlog::log_clock;
135
137
138 spdlog::filename_t basename = SPDLOG_FILENAME_T("test_logs/daily_rotate.txt");
139 daily_file_sink_st sink{basename, 2, 30, true, max_days};
140
141 // simulate messages with 24 intervals
142
143 for (int i = 0; i < days_to_run; i++)
144 {
145 auto offset = std::chrono::seconds{24 * 3600 * i};
146 sink.log(create_msg(offset));
147 }
148
149 REQUIRE(count_files("test_logs") == static_cast<size_t>(expected_n_files));
150}
151
152TEST_CASE("daily_logger rotate", "[daily_file_sink]")
153{
154 int days_to_run = 1;
155 test_rotate(days_to_run, 0, 1);
156 test_rotate(days_to_run, 1, 1);
157 test_rotate(days_to_run, 3, 1);
158 test_rotate(days_to_run, 10, 1);
159
160 days_to_run = 10;
161 test_rotate(days_to_run, 0, 10);
162 test_rotate(days_to_run, 1, 1);
163 test_rotate(days_to_run, 3, 3);
164 test_rotate(days_to_run, 9, 9);
165 test_rotate(days_to_run, 10, 10);
166 test_rotate(days_to_run, 11, 10);
167 test_rotate(days_to_run, 20, 10);
168}
T back_inserter(T... args)
#define TEST_CASE(...)
Definition catch.hpp:15119
#define REQUIRE(...)
Definition catch.hpp:15083
static filename_t calc_filename(const filename_t &filename, std::size_t index)
#define SPDLOG_FILENAME_T(s)
Definition common.h:107
SPDLOG_INLINE std::tm localtime() SPDLOG_NOEXCEPT
Definition os-inl.h:97
fmt::basic_memory_buffer< char, 250 > memory_buf_t
Definition common.h:116
T regex_match(T... args)
static spdlog::filename_t calc_filename(const spdlog::filename_t &basename, const tm &now_tm)
log_clock::time_point time
Definition log_msg.h:22
static filename_t calc_filename(const filename_t &filename, const tm &now_tm)
static void test_rotate(int days_to_run, uint16_t max_days, uint16_t expected_n_files)
static spdlog::details::log_msg create_msg(std::chrono::seconds offset)
fmt::basic_memory_buffer< spdlog::filename_t::value_type, 250 > filename_memory_buf_t
void require_message_count(const std::string &filename, const std::size_t messages)
Definition utils.cpp:49
void prepare_logdir()
Definition utils.cpp:10
std::size_t count_files(const std::string &folder)
Definition utils.cpp:109