mirror of
https://github.com/Icinga/icinga2.git
synced 2025-09-24 10:17:59 +02:00
Cache actual Logger#object_filter objects in Logger#m_ObjectFilterCache
This commit is contained in:
parent
0738d6b78f
commit
071dae815e
@ -65,14 +65,14 @@ void Logger::Start(bool runtimeCreated)
|
||||
void Logger::SetObjectFilter(const Dictionary::Ptr& value, bool suppress_events, const Value& cookie)
|
||||
{
|
||||
ObjectImpl<Logger>::SetObjectFilter(value, suppress_events, cookie);
|
||||
CheckObjectFilter();
|
||||
UpdateCheckObjectFilterCache();
|
||||
}
|
||||
|
||||
void Logger::OnAllConfigLoaded()
|
||||
{
|
||||
ObjectImpl<Logger>::OnAllConfigLoaded();
|
||||
m_CalledOnAllConfigLoaded.store(true);
|
||||
CheckObjectFilter();
|
||||
UpdateCheckObjectFilterCache();
|
||||
}
|
||||
|
||||
void Logger::Stop(bool runtimeRemoved)
|
||||
@ -297,7 +297,7 @@ void Logger::UpdateMinLogSeverity()
|
||||
m_MinLogSeverity.store(result);
|
||||
}
|
||||
|
||||
void Logger::CheckObjectFilter()
|
||||
void Logger::UpdateCheckObjectFilterCache()
|
||||
{
|
||||
if (!m_CalledOnAllConfigLoaded.load()) {
|
||||
return;
|
||||
@ -306,27 +306,43 @@ void Logger::CheckObjectFilter()
|
||||
auto filter (GetObjectFilter());
|
||||
|
||||
if (!filter) {
|
||||
ObjectLock lock (this);
|
||||
m_ObjectFilterCache.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
ObjectLock lock (filter);
|
||||
std::vector<ConfigObject*> allObjects;
|
||||
|
||||
for (auto& kv : filter) {
|
||||
auto type (Type::GetByName(kv.first));
|
||||
auto ctype (dynamic_cast<ConfigType*>(type.get()));
|
||||
Array::Ptr objects = kv.second;
|
||||
{
|
||||
ObjectLock lock (filter);
|
||||
|
||||
if (ctype && objects) {
|
||||
ObjectLock lock (objects);
|
||||
for (auto& kv : filter) {
|
||||
auto type (Type::GetByName(kv.first));
|
||||
auto ctype (dynamic_cast<ConfigType*>(type.get()));
|
||||
Array::Ptr objects = kv.second;
|
||||
|
||||
for (String object : objects) {
|
||||
if (!ctype->GetObject(object)) {
|
||||
Log(LogWarning, GetReflectionType()->GetName())
|
||||
<< "Missing " << kv.first << " '" << object << "' in object filter of '" << GetName() << "'.";
|
||||
if (ctype && objects) {
|
||||
ObjectLock lock (objects);
|
||||
|
||||
for (String name : objects) {
|
||||
auto object (ctype->GetObject(name));
|
||||
|
||||
if (object) {
|
||||
allObjects.emplace_back(object.get());
|
||||
} else {
|
||||
Log(LogWarning, GetReflectionType()->GetName())
|
||||
<< "Missing " << kv.first << " '" << name << "' in name filter of '" << GetName() << "'.";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::sort(allObjects.begin(), allObjects.end());
|
||||
|
||||
ObjectLock lock (this);
|
||||
|
||||
m_ObjectFilterCache.swap(allObjects);
|
||||
}
|
||||
|
||||
Log::Log(LogSeverity severity, String facility, const String& message)
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "base/logger-ti.hpp"
|
||||
#include <set>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
namespace icinga
|
||||
{
|
||||
@ -99,7 +100,7 @@ protected:
|
||||
private:
|
||||
static void UpdateMinLogSeverity();
|
||||
|
||||
void CheckObjectFilter();
|
||||
void UpdateCheckObjectFilterCache();
|
||||
|
||||
static std::mutex m_Mutex;
|
||||
static std::set<Logger::Ptr> m_Loggers;
|
||||
@ -111,6 +112,7 @@ private:
|
||||
static Atomic<LogSeverity> m_MinLogSeverity;
|
||||
|
||||
Atomic<bool> m_CalledOnAllConfigLoaded {false};
|
||||
std::vector<ConfigObject*> m_ObjectFilterCache;
|
||||
};
|
||||
|
||||
class Log
|
||||
|
Loading…
x
Reference in New Issue
Block a user