Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarLogging.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-08-01 20:23:05 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-08-01 20:23:05 +1000
commit678a4619044a0f9f8decfeddd555e7b2d7084a0c (patch)
tree4bb3922f0dbe689453f01d6bdd0f4baf8fe1cae5 /source/core/StarLogging.cpp
parent9ba734ea14c610f54521f2faa30f048f0e4eadf9 (diff)
Logger: Do string formatting before lock and only if LogLevel is loggable
Diffstat (limited to 'source/core/StarLogging.cpp')
-rw-r--r--source/core/StarLogging.cpp26
1 files changed, 23 insertions, 3 deletions
diff --git a/source/core/StarLogging.cpp b/source/core/StarLogging.cpp
index b80ae6a..ba58c04 100644
--- a/source/core/StarLogging.cpp
+++ b/source/core/StarLogging.cpp
@@ -16,6 +16,7 @@ LogSink::~LogSink() {}
void LogSink::setLevel(LogLevel level) {
m_level = level;
+ Logger::refreshLoggable();
}
LogLevel LogSink::level() {
@@ -44,11 +45,13 @@ void FileLogSink::log(char const* msg, LogLevel level) {
void Logger::addSink(LogSinkPtr s) {
MutexLocker locker(s_mutex);
s_sinks.insert(s);
+ refreshLoggable();
}
void Logger::removeSink(LogSinkPtr s) {
MutexLocker locker(s_mutex);
s_sinks.erase(s);
+ refreshLoggable();
}
LogSinkPtr Logger::stdoutSink() {
@@ -59,19 +62,36 @@ LogSinkPtr Logger::stdoutSink() {
void Logger::removeStdoutSink() {
MutexLocker locker(s_mutex);
s_sinks.erase(s_stdoutSink);
+ refreshLoggable();
}
void Logger::log(LogLevel level, char const* msg) {
- MutexLocker locker(s_mutex);
+ if (loggable(level)) {
+ MutexLocker locker(s_mutex);
+ for (auto const& l : s_sinks) {
+ if (l->level() <= level)
+ l->log(msg, level);
+ }
+ }
+}
+bool Logger::loggable(LogLevel level) {
+ return s_loggable[(int)level];
+}
+
+void Logger::refreshLoggable() {
+ Array<bool, 4> loggable;
for (auto const& l : s_sinks) {
- if (l->level() <= level)
- l->log(msg, level);
+ for (auto i = (size_t)l->level(); i != loggable.size(); ++i)
+ loggable[i] = true;
}
+ MutexLocker locker(s_mutex);
+ s_loggable = loggable;
}
shared_ptr<StdoutLogSink> Logger::s_stdoutSink = make_shared<StdoutLogSink>();
HashSet<LogSinkPtr> Logger::s_sinks{s_stdoutSink};
+Array<bool, 4> Logger::s_loggable = Array<bool, 4>::filled(false);
Mutex Logger::s_mutex;
String LogMap::getValue(String const& key) {