UniSet  2.2.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>).