Согласно народной примете, в новый дом первым нужно впускать интернет-кабель. И где он ляжет - там ставьте кровать. И стол. И комп. И жрачку.
Как только столкнулся с администрированием Windows сервера, появилась необходимость в постоянном слежении за состоянием таких сервисов, как Apache, MySQL и тому подобных... Для бесперебойной работы сервисов необходимо было максимально быстро узнавать об ошибках и восстанавливать работоспособность толи перезагрузкой сервиса, толи переконфигурированием. По началу просто периодически заходил на сервер и смотрел логи. Но когда работы действительно много, особо не уделяешь этому внимания, что иногда приводит к нескольким часам простоя сервисов и жалобам клиентов.
В последствии я нашел решения для себя в виде триггера событий – команды Eventtriggers, в совокупности с Eventquery и php скрипта отправки писем. Как это все работает? Вот так:
Создание триггеров событий:
Собственно мне необходимо было следить за двумя ветками «Event Viewer»: SYSTEM и APPLICATION. Для каждого я создал свой триггер. Каждый триггер запускает скрипт указывая в параметрах какого типа ошибка, чтобы знать в скрипте какой список отправлять в сообщении.
Для того чтобы создать триггера событий, необходимо проделать следующее (Подробнее о eventtriggers и eventquery см. ниже) :
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: Создание триггеров событий
Примечательно то, что также после создания триггеров создаются элементы в Scheduled Tasks:
Eventtriggers: отображение в Scheduled Tasks
Это указывает на то, что триггеры основаны на периодическом обращение к логам и реагировании на новые записи в нем. И действительно, указанное в триггере приложение запускается не сразу после появления ошибки, а с небольшой задержкой.
Удалить триггер можно командой:
eventtriggers /delete /tid 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-ть последних ошибок с подробной информацией в виде таблицы.
Полный текст возможного скрипта:
<?php $argv[0] = ""; // Если скрипт запущен с помощью триггера событий if ($argv[1] == "eventtriggers") { // Собираем подробную информацию о последних 5 ошибках и записываем в eventquery.msg в виде ошибок passthru('cscript C:\WINDOWS\system32\eventquery.vbs /fi "Type eq Error" /r 5 /l '.$argv[2].' /v /fo TABLE > 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 | имя_фильтра. Задание типов событий, которые следует включить в запрос или исключить из него. Допустимыми именами фильтров, операторами и значениями являются следующие.
|
||||||||||||||||||||||||
| /fo | {TABLE|LIST|CSV} Задание формата выходных данных. Допустимые значения: table, list и csv. |
||||||||||||||||||||||||
| /r | диапазон_событий Задание диапазона событий, включаемых в список.
|
||||||||||||||||||||||||
| /nh | Запрещение вывода заголовков столбцов. Этот параметр является допустимым при задании форматов table и csv. | ||||||||||||||||||||||||
| /v | Задание отображения подробных сведений о событиях в выходных данных. | ||||||||||||||||||||||||
| /l | [APPLICATION] [SYSTEM] [SECURITY] ["DNS server"] [заданный_пользователем_журнал] [имя_журнала_каталога] [*] |
Задание журналов для просмотра. Допустимые значения: Application, System, Security, "DNS server", заданный пользователем журнал и журнал каталога.
Комментарии
Отправить комментарий