|
UniSet
2.2.1
|
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);
Агрегатор позволяет получать список подчинённых ему потоков (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 )
{
..что-то делать..
}
1.7.6.1