UniSet 2.32.1
Агрегатор логов (LogAgregator)

Общее описание

LogAgregator это класс предназначенный для объединения нескольких DebugStream в один поток. При этом LogAgregator сам является DebugStream и обладает всеми его свойствами.

LogAgregator позволяет управлять каждым из своих логов в отдельности по имени лога.

std::shared_ptr<DebugStream> dlog1 = std::make_shared<DebugStream>();
std::shared_ptr<DebugStream> dlog2 = std::make_shared<DebugStream>();
std::shared_ptr<DebugStream> la1 = make_shared<LogAgregator>("la1");
la1->add(dlog1,"dlog1");
la1->add(dlog1,"dlog2");
// Работа с логами через агрегатор
la1->addLevel("dlog1",Debug::INFO);

Помимо этого при помощи агрегатора можно сразу создавать дочерние логи

auto log10 = la1->create("dlog10");
log10->warn() << "WARNING MESSAGE" << endl;

Иерархия агрегаторов

Агрегатор позволяет строить иерархии из агрегаторов. При добавлении дочернего агрегатора, все обращения к подчинённым логам другого агрегатора происходят по имени включающим в себя имя дочернего агрегатора. Пример:

// Где-то в программе есть DebugStream (логи)
std::shared_ptr<DebugStream> dlog1 = std::make_shared<DebugStream>();
std::shared_ptr<DebugStream> dlog2 = std::make_shared<DebugStream>();
std::shared_ptr<DebugStream> dlog3 = std::make_shared<DebugStream>();
std::shared_ptr<DebugStream> dlog4 = std::make_shared<DebugStream>();
std::shared_ptr<LogAgregator> la1 = make_shared<LogAgregator>("la1");
la1->add(dlog1,"dlog1");
la1->add(dlog1,"dlog2");
// Работа с логами через агрегатор
la1->addLevel("dlog1",Debug::INFO);
..
// При этом можно выводить и напрямую в агрегатор
la1->info() << "INFO MESSAGE" << endl;
...
std::shared_ptr<LogAgregator> la2 = make_shared<LogAgregator>("la2");
la2->add(dlog1,"dlog3");
la2->add(dlog1,"dlog4");
// работа напрямую...
la2->addLevel("dlog4",Debug::WARN);
// Добавление второго агрегатора в первый..
la1->add(la2);
...
// теперь для обращения к логам второго агрегатора через первый..
// нужно добавлять его имя и разделитель "/" (LogAgregator::sep)
la1->addLevel("la2/dlog4",Debug::CRIT);
Заметки
Все эти свойства в полной мере используются при управлении логами через LogServer. В обычной "жизни" агрегатор вряд ли особо нужен.

Управление логами с использованием регулярных выражений

Агрегатор позволяет получать список подчинённых ему потоков (DebugStream) по именам удовлетворяющим заданному регулярному выражению. Пример: Предположим что иерархия подчинённых потоков выглядит следующим образом

log1
log2
log3
loga2/log1
loga2/log2
loga2/loga3/log1
loga2/loga3/log2
loga2/loga3/log3
...
\endode
Для управления логами можно получить например список всех подчинённых потоков для loga3
\code
auto lst = la->getLogList(".*loga3.*");
for( auto&& l: lst )
{
..что-то делать..
}
Заметки
Полнота и формат поддерживаемых регулярных выражений зависит от поддержки компилятором стандарта с++11 (класс <regex>).