diff options
| author | 2024-08-23 20:04:25 +0100 | |
|---|---|---|
| committer | 2024-08-23 20:10:21 +0100 | |
| commit | 33fef944f28243173d8708a255954043e29f5dd9 (patch) | |
| tree | 6a68bc423114d635a3ee3f350967f504a4e02425 /src/logging.cpp | |
| parent | Use C++20 <format> instead of fmtlib when available. (diff) | |
| parent | Close loggers and notify opers if they throw any exceptions. (diff) | |
Merge branch 'insp4' into master.
Diffstat (limited to 'src/logging.cpp')
| -rw-r--r-- | src/logging.cpp | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/logging.cpp b/src/logging.cpp index 649396513..7f772aefb 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -181,6 +181,11 @@ Log::Manager::Info::Info(Level l, TokenList t, MethodPtr m, bool c, const Engine { } +bool Log::Manager::Info::Suitable(Level l, const std::string& t) const +{ + return level >= l && types.Contains(t) && !dead; +} + Log::Manager::Manager() : filelog(nullptr) , stderrlog(nullptr, "stderr", stderr) @@ -256,15 +261,27 @@ void Log::Manager::OpenLogs(bool requiremethods) if (requiremethods && caching) { // The server has finished starting up so we can write out any cached log messages. - for (const auto& logger : loggers) + for (auto& logger : loggers) { - if (!logger.method->AcceptsCachedMessages()) + if (logger.dead || !logger.method->AcceptsCachedMessages()) continue; // Does not support logging. for (const auto& message : cache) { - if (logger.level >= message.level && logger.types.Contains(message.type)) + if (!logger.Suitable(message.level, message.type)) + continue; + + try + { logger.method->OnLog(message.time, message.level, message.type, message.message); + } + catch (const CoreException& err) + { + logger.dead = true; + logger.method.reset(); + ServerInstance->SNO.WriteGlobalSno('a', "A logger threw an exception: {}", err.GetReason()); + break; + } } } @@ -302,10 +319,22 @@ void Log::Manager::Write(Level level, const std::string& type, const std::string logging = true; time_t time = ServerInstance->Time(); - for (const auto& logger : loggers) + for (auto& logger : loggers) { - if (logger.level >= level && logger.types.Contains(type)) + if (!logger.Suitable(level, type)) + continue; + + try + { logger.method->OnLog(time, level, type, message); + } + catch (const CoreException& err) + { + logger.dead = true; + logger.method.reset(); + ServerInstance->SNO.WriteGlobalSno('a', "A logger threw an exception: {}", err.GetReason()); + break; + } } if (caching) |
