Logger Initializer - Sets Up all the logging handlers required for having the above loggers.
58 {
59
60 g_szProgramStartTimeString = szProgramTimeLogsDir;
61
62
63 std::filesystem::path szFilePath;
64 std::filesystem::path szFilename;
65 szFilePath = szLoggingOutputPath;
66 szFilePath += g_szProgramStartTimeString + "/";
67 szFilename = "console_output";
68
69
70 g_szLoggingOutputPath = szFilePath;
71
72
73 if (!std::filesystem::exists(szFilePath))
74 {
75
76 if (!std::filesystem::create_directories(szFilePath))
77 {
78
79 std::cerr << "Unable to create the logging output directory: " << szFilePath.string() << " for console output file." << std::endl;
80 }
81 }
82 else
83 {
84
85 std::cerr << "Unable to create logging output directory " << szFilePath.string() << ": it already exists." << std::endl;
86 }
87
88
89 std::filesystem::path szFullOutputPath = szFilePath / szFilename;
90
91
92 quill::ConsoleSinkConfig::Colours qColors;
93 qColors.apply_default_colours();
94 qColors.assign_colour_to_log_level(quill::LogLevel::TraceL3, constants::szTraceL3Color);
95 qColors.assign_colour_to_log_level(quill::LogLevel::TraceL2, constants::szTraceL2Color);
96 qColors.assign_colour_to_log_level(quill::LogLevel::TraceL1, constants::szTraceL1Color);
97 qColors.assign_colour_to_log_level(quill::LogLevel::Debug, constants::szDebugColor);
98 qColors.assign_colour_to_log_level(quill::LogLevel::Info, constants::szInfoColor);
99 qColors.assign_colour_to_log_level(quill::LogLevel::Warning, constants::szWarningColor);
100 qColors.assign_colour_to_log_level(quill::LogLevel::Error, constants::szErrorColor);
101 qColors.assign_colour_to_log_level(quill::LogLevel::Critical, constants::szCriticalColor);
102 qColors.assign_colour_to_log_level(quill::LogLevel::Backtrace, constants::szBacktraceColor);
103
104
105 std::string szLogFilePattern = "%(time) %(log_level) [%(thread_id)] [%(file_name):%(line_number)] %(message)";
106 std::string szCSVFilePattern = "%(time),\t%(log_level),\t[%(thread_id)],\t[%(file_name):%(line_number)],\t\"%(message)\"";
107 std::string szConsolePattern = "%(time) %(log_level:9) [%(thread_id)] [%(file_name):%(line_number)] %(message)";
108 std::string szTimestampPattern = "%Y-%m-%d %H:%M:%S.%Qms";
109
110
111 std::shared_ptr<quill::Sink> qLogFileSink = quill::Frontend::create_or_get_sink<MRDTRotatingFileSink>(
112 szFullOutputPath.replace_extension(".log"),
113 []()
114 {
115 quill::RotatingFileSinkConfig cfg;
116 cfg.set_open_mode('a');
117 return cfg;
118 }(),
119 szLogFilePattern,
120 szTimestampPattern,
121 quill::Timezone::LocalTime
122 );
123
124 std::shared_ptr<quill::Sink> qCSVFileSink = quill::Frontend::create_or_get_sink<MRDTRotatingFileSink>(
125 szFullOutputPath.replace_extension(".csv"),
126 []()
127 {
128 quill::RotatingFileSinkConfig cfg;
129 cfg.set_open_mode('a');
130 return cfg;
131 }(),
132 szCSVFilePattern,
133 szTimestampPattern,
134 quill::Timezone::LocalTime
135 );
136
137 std::shared_ptr<quill::Sink> qConsoleSink =
138 quill::Frontend::create_or_get_sink<MRDTConsoleSink>("ConsoleSink",
139 qColors,
140 quill::ConsoleSinkConfig::ColourMode::Automatic,
141 szConsolePattern,
142 szTimestampPattern
143 );
144
145
146 quill::BackendOptions qBackendConfig;
147
148
149 quill::Backend::start(qBackendConfig);
150
151
152 g_qFileLogger = quill::Frontend::create_or_get_logger("FILE_LOGGER", {qLogFileSink, qCSVFileSink});
153 g_qConsoleLogger = quill::Frontend::create_or_get_logger("CONSOLE_LOGGER", {qConsoleSink});
154 g_qSharedLogger = quill::Frontend::create_or_get_logger("SHARED_LOGGER", {qLogFileSink, qCSVFileSink, qConsoleSink});
155
156
157 g_eFileLogLevel = constants::FILE_DEFAULT_LEVEL;
158 g_eConsoleLogLevel = constants::CONSOLE_DEFAULT_LEVEL;
159
160
161 g_qFileLogger->set_log_level(quill::LogLevel::TraceL3);
162 g_qConsoleLogger->set_log_level(quill::LogLevel::TraceL3);
163 g_qSharedLogger->set_log_level(quill::LogLevel::TraceL3);
164
165
166 g_qFileLogger->init_backtrace(10, quill::LogLevel::Critical);
167 g_qConsoleLogger->init_backtrace(10, quill::LogLevel::Critical);
168 g_qSharedLogger->init_backtrace(10, quill::LogLevel::Critical);
169 }