17 result = it->second.logger.get();
18 it->second.lastRetrieved = irsol::types::clock_t::now();
20 auto newLogger = spdlog::default_logger()->clone(name);
24 auto& all_sinks = newLogger->sinks();
27 bool fileSinkFound =
false;
28 std::string newLogFilePath;
29 for(
auto& existing_sink : all_sinks) {
31 spdlog::sinks::rotating_file_sink_mt* rotating_sink =
32 dynamic_cast<spdlog::sinks::rotating_file_sink_mt*
>(existing_sink.get())) {
33 std::string logFilePath = rotating_sink->filename();
35 size_t pos = logFilePath.rfind(
'.');
36 if(pos != std::string::npos) {
37 logFilePath = logFilePath.substr(0, pos);
39 newLogFilePath = logFilePath +
"_" + name +
".log";
45 newLogFilePath = name +
".log";
49 const auto maxFileSize = 1024 * 1024 * 5;
50 const auto maxFiles = 24;
51 auto fileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
52 newLogFilePath, maxFileSize, maxFiles,
false);
55 newLogger->sinks().push_back(fileSink);
57 LoggerInfo info = {newLogger, irsol::types::clock_t::now()};
66 std::min_element(
m_loggers.begin(),
m_loggers.end(), [](
const auto& a,
const auto& b) {
67 return a.second.lastRetrieved < b.second.lastRetrieved;
108initLogging(
const char* logFilePath, std::optional<spdlog::level::level_enum> minLogLevel)
112 const auto defaultConsoleLevel = spdlog::level::trace;
113 const auto defaultFileSinkLevel = spdlog::level::trace;
116 const auto defaultConsoleLevel = spdlog::level::info;
117 const auto defaultFileSinkLevel = spdlog::level::info;
120 auto consoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
123 const auto maxFileSize = 1024 * 1024 * 5;
124 const auto maxFiles = 24;
125 auto fileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
126 logFilePath, maxFileSize, maxFiles,
false);
131 std::make_shared<spdlog::logger>(
"irsol", spdlog::sinks_init_list{consoleSink, fileSink});
132 spdlog::set_default_logger(logger);
136 spdlog::flush_on(spdlog::level::trace);
139 spdlog::flush_on(spdlog::level::err);
143 spdlog::flush_every(std::chrono::seconds(2));
146 auto consoleLevel = defaultConsoleLevel;
147 auto fileSinkLevel = defaultFileSinkLevel;
148 if(minLogLevel.has_value()) {
150 consoleLevel = std::max({defaultConsoleLevel, *minLogLevel});
151 fileSinkLevel = std::max({defaultFileSinkLevel, *minLogLevel});
153 auto globalLevel = std::min({consoleLevel, fileSinkLevel});
155 consoleSink->set_level(consoleLevel);
156 fileSink->set_level(fileSinkLevel);
157 logger->set_level(globalLevel);
160 spdlog::info(
"Logging initialized with sync levels");
161 spdlog::info(
"Console {}", spdlog::level::to_string_view(consoleLevel));
162 spdlog::info(
"File: {}", spdlog::level::to_string_view(fileSinkLevel));
163 if(minLogLevel.has_value()) {
164 spdlog::info(
"Global: {} (overridden)", spdlog::level::to_string_view(minLogLevel.value()));
166 spdlog::info(
"Global: {}", spdlog::level::to_string_view(globalLevel));