LogIt++
Header-only, macro-first C++ logging library
Loading...
Searching...
No Matches
example_logit_memory_logger.cpp
Go to the documentation of this file.
1
3
4// #define LOGIT_BASE_PATH "E:\\_repoz\\log-it-cpp" <- set via CMake
5
6#include <cstdint>
7#include <iostream>
8#include <mutex>
9#include <vector>
10#include <logit.hpp>
11
12int main() {
13 std::cout << "Starting in-memory snapshot logger example..." << std::endl;
14
16 LOGIT_ADD_MEMORY_LOGGER_SINGLE_MODE(100, 64 * 1024, 60 * 60 * 1000);
17 const int memory_index = static_cast<int>(logit::Logger::get_instance().logger_count()) - 1;
18
19 LOGIT_INFO("This goes to the regular backends");
20 LOGIT_INFO_TO(memory_index, "Remote control can fetch this later");
21 LOGIT_WARN_TO(memory_index, "Latest warning for the control plane");
22 LOGIT_SECTION_TO(memory_index, "Network Settings");
23 LOGIT_RAW_TO(memory_index, "Protocol: https");
24 LOGIT_RAW_TO(memory_index, "Transport Mode: standard");
25 LOGIT_RAW_TO(memory_index, "DNS Server: 1.1.1.1");
26 LOGIT_WAIT();
27
28 const auto recent_lines = LOGIT_GET_BUFFERED_STRINGS(memory_index);
29 const auto recent_entries = LOGIT_GET_BUFFERED_ENTRIES(memory_index);
30
31 std::cout << "Buffered strings:" << std::endl;
32 for (const auto& line : recent_lines) {
33 std::cout << " " << line << std::endl;
34 }
35
36 std::cout << "Buffered structured entries:" << std::endl;
37 for (const auto& entry : recent_entries) {
38 std::cout << " [" << logit::to_string(entry.level) << "] "
39 << entry.timestamp_ms << " " << entry.message << std::endl;
40 }
41
42 const auto recent_records = LOGIT_READ_RECENT_ASC(memory_index, 3, 0);
43 std::cout << "Recent records via ILogReader:" << std::endl;
44 for (const auto& record : recent_records) {
45 std::cout << " [" << logit::to_string(record.level) << "] "
46 << record.timestamp_ms << " " << record.message << std::endl;
47 }
48
49 const int64_t now_ms = LOGIT_CURRENT_TIMESTAMP_MS();
50 const auto range_records = LOGIT_READ_RANGE(
51 memory_index,
52 now_ms - 60LL * 60 * 1000,
53 now_ms + 1,
54 0);
55 std::cout << "Range records for the last hour: "
56 << range_records.size() << std::endl;
57
58 std::vector<logit::LogRecordSnapshot> live_updates;
59 std::mutex live_mutex;
60 const uint64_t callback_id = LOGIT_ADD_LOG_CALLBACK(
61 memory_index,
62 ([&live_updates, &live_mutex](const logit::LogRecordSnapshot& view) {
63 std::lock_guard<std::mutex> lock(live_mutex);
64 live_updates.push_back(view);
65 }));
66
67 LOGIT_INFO_TO(memory_index, "Live callback event 1");
68 LOGIT_ERROR_TO(memory_index, "Live callback event 2");
69 LOGIT_WAIT();
70
71 std::size_t live_count = 0;
72 {
73 std::lock_guard<std::mutex> lock(live_mutex);
74 live_count = live_updates.size();
75 std::cout << "Live updates received:" << std::endl;
76 for (const auto& record : live_updates) {
77 std::cout << " [" << logit::to_string(record.level) << "] "
78 << record.message << std::endl;
79 }
80 }
81
82 if (LOGIT_REMOVE_LOG_CALLBACK(memory_index, callback_id)) {
83 std::cout << "Callback removed" << std::endl;
84 }
85
86 LOGIT_WARN_TO(memory_index, "Stored after callback removal");
87 LOGIT_WAIT();
88
89 {
90 std::lock_guard<std::mutex> lock(live_mutex);
91 std::cout << "Live updates after unsubscribe: "
92 << live_updates.size() << " (was " << live_count << ")"
93 << std::endl;
94 }
95
97 return 0;
98}
static Logger & get_instance()
Retrieves singleton instance of Logger.
Definition Logger.hpp:53
std::size_t logger_count() const
Returns the number of registered logger strategies.
Definition Logger.hpp:507
#define LOGIT_CURRENT_TIMESTAMP_MS()
Macro to get the current timestamp in milliseconds.
Definition config.hpp:84
#define LOGIT_RAW_TO(index, message)
Logs an already formatted raw message to a specific logger.
#define LOGIT_ADD_CONSOLE_DEFAULT()
Macro for adding the default console logger.
#define LOGIT_WAIT()
Macro for waiting for all asynchronous loggers to finish processing.
#define LOGIT_INFO(...)
#define LOGIT_SHUTDOWN()
Macro for shutting down logger system.
#define LOGIT_GET_BUFFERED_ENTRIES(logger_index)
Retrieves buffered structured entries from a specific logger.
#define LOGIT_SECTION_TO(index, name)
Logs a raw section header to a specific logger.
#define LOGIT_INFO_TO(index,...)
#define LOGIT_ADD_LOG_CALLBACK(logger_index, callback)
Registers a callback to receive newly written log records.
#define LOGIT_READ_RECENT_ASC(logger_index, limit, period_ms)
Reads recent records in ascending order (oldest first).
#define LOGIT_REMOVE_LOG_CALLBACK(logger_index, callback_id)
Unregisters a previously added log callback.
#define LOGIT_ADD_MEMORY_LOGGER_SINGLE_MODE(max_records, max_bytes, max_age_ms)
Macro for adding an in-memory logger in single_mode with explicit limits.
#define LOGIT_ERROR_TO(index,...)
#define LOGIT_WARN_TO(index,...)
#define LOGIT_READ_RANGE(logger_index, from_ms, to_ms, limit)
Reads a time-range of records from a backend that supports ILogReader.
#define LOGIT_GET_BUFFERED_STRINGS(logger_index)
Retrieves buffered formatted messages from a specific logger.
Unified umbrella header for the LogIt++ library.
std::string to_string(LogLevel level, int mode=0)
Convert LogLevel to a std::string representation.
Definition enums.hpp:109
Common owning snapshot of a stored log record.