Introduce Logger#object_filter

This commit is contained in:
Alexander A. Klimov 2023-08-11 12:48:40 +02:00
parent d55c3644a2
commit aaa06575af
3 changed files with 49 additions and 0 deletions

View File

@ -74,6 +74,47 @@ void Logger::Stop(bool runtimeRemoved)
ObjectImpl<Logger>::Stop(runtimeRemoved);
}
void Logger::ValidateObjectFilter(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils)
{
ObjectImpl<Logger>::ValidateObjectFilter(lvalue, utils);
auto filter (lvalue());
if (filter) {
ObjectLock lock (filter);
for (auto& kv : filter) {
auto type (Type::GetByName(kv.first));
if (!type) {
BOOST_THROW_EXCEPTION(
ValidationError(this, {"object_filter"}, "No such type: '" + kv.first + "'")
);
}
if (!dynamic_cast<ConfigType*>(type.get())) {
BOOST_THROW_EXCEPTION(
ValidationError(this, {"object_filter"}, "Not a config object type: '" + kv.first + "'")
);
}
Array::Ptr objects = kv.second;
if (objects) {
ObjectLock lock (objects);
for (auto& object : objects) {
if (object.GetType() != ValueString) {
BOOST_THROW_EXCEPTION(
ValidationError(this, {"object_filter", kv.first}, "Must be an array of strings.")
);
}
}
}
}
}
}
std::set<Logger::Ptr> Logger::GetLoggers()
{
std::unique_lock<std::mutex> lock(m_Mutex);

View File

@ -92,6 +92,7 @@ public:
protected:
void Start(bool runtimeCreated) override;
void Stop(bool runtimeRemoved) override;
void ValidateObjectFilter(const Lazy<Dictionary::Ptr>& lvalue, const ValidationUtils& utils) override;
private:
static void UpdateMinLogSeverity();

View File

@ -12,6 +12,13 @@ abstract class Logger : ConfigObject
[config, set_virtual] String severity {
default {{{ return "information"; }}}
};
[config] Dictionary::Ptr object_filter;
};
validator Logger {
Dictionary object_filter {
Array "*";
};
};
}