NetXMS Support Forum

Russian Support => Общие вопросы => Topic started by: VSS on November 17, 2014, 11:33:07 AM

Title: Сохранение состояние при использовании LogWatch
Post by: VSS on November 17, 2014, 11:33:07 AM
Коллеги,

возникла задача при мониторинге с использованием LogWatch генерировать уведомление только в случае если определенная запись появляется в файле (журнале) 4-е раза. Т.е. надо сделать некий счетчик и если он достигает определенного значения генерировать оповещение/событие и сбрасывать счетчик.

Подскажите, пожалуйста, как оптимальнее всего решить данную задачу?
Title: Re: Сохранение состояние при использовании LogWatch
Post by: Alex Kirhenshtein on November 17, 2014, 03:30:53 PM
Добавьте в EPP такое правило:

Event: событие, которое генерирует LogWatch для этой строчки
Filtering script:if (int($node->logMatchCount) > 3) {
   $node->logMatchCount = 0;
   return true;
}
$node->logMatchCount = int($node->logMatchCount) + 1;
return false;

Action: отсылка оповещения

Я бы еще добавил проверку времени (сбрасывать счетчик, если пршло больше X секунд – 600 в примере):now = time();
if (now - int($node->logLastMatch) > 600 || int($node->logMatchCount) > 3) {
   $node->logLastMatch = now;
   $node->logMatchCount = 0;
   return true;
}
$node->logLastMatch = now;
$node->logMatchCount = int($node->logMatchCount);
return false;


Как это работает:
Счетчик сохраняется в custom attribute для сервера, на котором котором произошло событие ($node).
$node->logMatchCount и $node->logLastMatch - это упрощенный доступ к custom attribute, альтернатива GetCustomAttribute($node, ...) и SetCustomAttribute($node, ...).
Конструкция int($node->logMatchCount) - для ситуации, когда артибута еще нет, и результат NULL, принудительный каст в int даст на выходе 0, который можно сравнивать с другим числом (вместо конструкции вида "if ($node->logMatchCount != NULL && $node->logMatchCount > 3)").