Слежение за системными ошибками на Windows сервере. Eventtriggers.

Как только столкнулся с администрированием Windows сервера, появилась необходимость в постоянном слежении за состоянием таких сервисов, как Apache, MySQL и тому подобных… Для бесперебойной работы сервисов необходимо было максимально быстро узнавать об ошибках и восстанавливать работоспособность толи перезагрузкой сервиса, толи переконфигурированием. По началу просто периодически заходил на сервер и смотрел логи. Но когда работы действительно много, особо не уделяешь этому внимания, что иногда приводит к нескольким часам простоя сервисов и жалобам клиентов.

В последствии я нашел решения для себя в виде триггера событий – команды Eventtriggers, в совокупности с Eventquery и php скрипта отправки писем. Как это все работает?

Смотри далее как это работает…

Как только столкнулся с администрированием Windows сервера, появилась необходимость в постоянном слежении за состоянием таких сервисов, как Apache, MySQL и тому подобных… Для бесперебойной работы сервисов необходимо было максимально быстро узнавать об ошибках и восстанавливать работоспособность толи перезагрузкой сервиса, толи переконфигурированием. По началу просто периодически заходил на сервер и смотрел логи. Но когда работы действительно много, особо не уделяешь этому внимания, что иногда приводит к нескольким часам простоя сервисов и жалобам клиентов.

В последствии я нашел решения для себя в виде триггера событий – команды Eventtriggers, в совокупности с Eventquery и php скрипта отправки писем. Как это все работает? Вот так:

• Созданный триггер на основе утилиты eventtriggers.exe в случае возникновения в «Event Viewer» сообщения об ошибке запускает скрипт send_alert.php;
• Скрипт services_send_alert.php запускает eventquery.vbs с параметрами, который собирает сведения о последних ошибках и записывает их в файл.
• После отработки eventquery.vbs, скрипт send_alert.php читает текст из файла и отправляет сообщение администратору.

Создание триггеров событий:
Собственно мне необходимо было следить за двумя ветками «Event Viewer»: SYSTEM и APPLICATION. Для каждого я создал свой триггер. Каждый триггер запускает скрипт указывая в параметрах какого типа ошибка, чтобы знать в скрипте какой список отправлять в сообщении.
Для того чтобы создать триггера событий, необходимо проделать следующее (Подробнее о eventtriggers и eventquery см. ниже) :

1. Запускаем cmd.exe;

2. Создаем триггер событий для ошибок приложения:
eventtriggers /create /tr «Send mail about System Error» /l SYSTEM /t error /tk «c:\php\php-cgi.exe C:\www\tools\send_alert.php eventtriggers System Error…»
после запуска потребуется ввести пароль администратора;

3. Создаем триггер событий для системных ошибок:
eventtriggers /create /tr «Send mail about Application Error» /l APPLICATION /t error /tk «c:\php\php-cgi.exe C:\www\tools\send_alert.php eventtriggers Application Error…»
после запуска потребуется ввести пароль администратора.

На рисунке ниже можно увидеть процесс создания триггеров:

Eventtriggers: Создание триггеров событийEventtriggers: Создание триггеров событий

Примечательно то, что также после создания триггеров создаются элементы в Scheduled Tasks:

Eventtriggers: отображение в Scheduled TasksEventtriggers: отображение в Scheduled Tasks

Это указывает на то, что триггеры основаны на периодическом обращение к логам и реагировании на новые записи в нем. И действительно, указанное в триггере приложение запускается не сразу после появления ошибки, а с небольшой задержкой.

Удалить триггер можно командой:

eventtriggers /delete /tid 2

где 2 – это идентификатор моего триггера для системных ошибок.

Описание скрипта send_alert.php:
При вызове send_alert.php в качестве параметров передаются источник запуска, имя журнала и\или неограниченное количество параметров, которые передаются в письмо текстом. Если в качестве первого параметра стоит фраза “eventtriggers”, тогда производится запуск Eventquery для сбора дополнительной информации о ошибке:


eventquery /fi «Type eq Error» /r 5 /l ‘.$argv[2].’ /v /fo TABLE > eventquery.msg

в втором аргументе передаётся тип ошибки, и данный аргумент используется в запросе, как имя журнала. В данном случае мы выбираем 5-ть последних ошибок с подробной информацией в виде таблицы.

Полный текст возможного скрипта: eventquery.msg’, $information);

// Если ошибок не произошло, считываем сведения из файла и удаляем его
if ($information === 0)
{
$information = file_get_contents(«eventquery.msg»);
unlink(«eventquery.msg»);
}
}

//формируем сообщение администратору
$text_message = «Windows alert:\r\n Information about is: «.implode(» «,$argv);

//Отправляем оповещения обслуживающему персоналу
$to = ‘admin_server@example.com’;
$subject = ‘AAAaaaaA!!!!Erooorrr!!!Erooorr!!!Help my!!!’;
$headers = ‘From: server@example.com’ . «\r\n» . ‘X-Mailer: PHP/’ . phpversion();
mail($to, $subject, $text_message, $headers);
?>

Также стоит контролировать количество отправляемых писем в течении времени, чтобы в случае появления подряд 10 ошибок не приводило к отправке 10 сообщений. Я использовал класс оповещения, встроенный в один из проектов на данном сервере, который все это контролировал, и реализовывать мне ничего не пришлось, все уже было.

Подробнее о команде eventtriggers:

eventtriggers create
Создание нового триггера событий, который отслеживает выполнение определенных условий в журнале событий и действует в соответствии с ними.

Синтаксис
eventtriggers[.exe] /create [/s компьютер [/u домен\пользователь [/p пароль]]] /tr имя_триггера [/l [APPLICATION] [SYSTEM] [SECURITY] [«DNS Server»] [LOG] [имя_журнала_каталога] [*] ] {[/eid ID] | [/t {ERROR | INFORMATION | WARNING | SUCCESSAUDIT | FAILUREAUDIT}] | [/so источник]} [/d описание] /tk имя_задания

Параметры

/tr имя_триггера
Задание понятного имени для триггера событий.
/l [APPLICATION] [SYSTEM] [SECURITY] [«DNS Server»] [LOG] [имя_журнала_каталога] [*] ]
Задание журналов для просмотра. Допустимые типы: Application, System, Security, DNS server, Log и журнал каталога. Допускается использование подстановочного знака (*), который указывается в качестве значения по умолчанию.
/t {ERROR|INFORMATION|WARNING|SUCCESSAUDIT|FAILUREAUDIT}
Задание типа события, которое требуется отслеживать с помощью триггера событий. Допускаются следующие значения: ERROR, INFORMATION, WARNING, SUCCESSAUDIT и FAILUREAUDIT. Этот параметр нельзя использовать вместе с параметрами /id или /so.
/tk имя_задания
Указание задания, команды или строки, выполняемых при соблюдении условий триггера событий.

eventtriggers delete
Удаление триггера событий из системы с помощью его кода.

Синтаксис
eventtriggers[.exe] /delete [/s компьютер [/u домен\пользователь [/p пароль]]] /tid {ID | *}

Параметры
/tid {код|*} Задание кодов удаляемых триггеров событий. Допускается использование подстановочного знака (*).

Подробнее о скрипте Eventquery.

Eventquery.vbs
Вывод списка событий и их свойств из одного или нескольких журналов событий.

Синтаксис
eventquery[.vbs] [/s компьютер [/u домен\пользователь [/p пароль]]] [/fi имя_фильтра] [/fo {TABLE | LIST | CSV}] [/r диапазон_событий [/nh] [/v] [/l [APPLICATION] [SYSTEM] [SECURITY] [«DNS server»] [заданный_пользователем_журнал] [имя_журнала_каталога] [*] ]

Параметры:

/fi имя_фильтра. Задание типов событий, которые следует включить в запрос или исключить из него. Допустимыми именами фильтров, операторами и значениями являются следующие.

Имя Оператор Значение
Datetime eq, ne, ge, le, gt, lt мм/дд/гг(гггг), чч:мм:ссAM(/PM)
Type eq, ne {ERROR | INFORMATION | WARNING | SUCCESS | SUCCESSAUDIT | FAILUREAUDIT}
ID eq, ne, ge, le, gt, lt Любое допустимое положительное число
User eq, ne Любая допустимая строка
Computer eq, ne Любая допустимая строка
Source eq, ne Любая допустимая строка
Category eq, ne Любая допустимая строка
/fo {TABLE|LIST|CSV}
Задание формата выходных данных. Допустимые значения: table, list и csv.
/r диапазон_событий
Задание диапазона событий, включаемых в список.

Значение Описание
N Включение в список последних событий, количество которых задается параметром N.
-N Включение в список самых старых событий, количество которых задается параметром N.
N1-N2 Включение в список событий с N1 по N2.
/nh Запрещение вывода заголовков столбцов. Этот параметр является допустимым при задании форматов table и csv.
/v Задание отображения подробных сведений о событиях в выходных данных.
/l [APPLICATION] [SYSTEM] [SECURITY] [«DNS server»] [заданный_пользователем_журнал] [имя_журнала_каталога] [*]

Задание журналов для просмотра. Допустимые значения: Application, System, Security, «DNS server», заданный пользователем журнал и журнал каталога.

Добавить комментарий