Как только столкнулся с администрированием Windows сервера, появилась необходимость в постоянном слежении за состоянием таких сервисов, как Apache, MySQL и тому подобных… Для бесперебойной работы сервисов необходимо было максимально быстро узнавать об ошибках и восстанавливать работоспособность толи перезагрузкой сервиса, толи переконфигурированием. По началу просто периодически заходил на сервер и смотрел логи. Но когда работы действительно много, особо не уделяешь этому внимания, что иногда приводит к нескольким часам простоя сервисов и жалобам клиентов.
В последствии я нашел решения для себя в виде триггера событий – команды Eventtriggers, в совокупности с Eventquery и php скрипта отправки писем. Как это все работает?
Смотри далее как это работает…
Как только столкнулся с администрированием Windows сервера, появилась необходимость в постоянном слежении за состоянием таких сервисов, как Apache, MySQL и тому подобных… Для бесперебойной работы сервисов необходимо было максимально быстро узнавать об ошибках и восстанавливать работоспособность толи перезагрузкой сервиса, толи переконфигурированием. По началу просто периодически заходил на сервер и смотрел логи. Но когда работы действительно много, особо не уделяешь этому внимания, что иногда приводит к нескольким часам простоя сервисов и жалобам клиентов.
В последствии я нашел решения для себя в виде триггера событий – команды Eventtriggers, в совокупности с Eventquery и php скрипта отправки писем. Как это все работает? Вот так:
• Скрипт services_send_alert.php запускает eventquery.vbs с параметрами, который собирает сведения о последних ошибках и записывает их в файл.
• После отработки eventquery.vbs, скрипт send_alert.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…»
после запуска потребуется ввести пароль администратора.
На рисунке ниже можно увидеть процесс создания триггеров:
Примечательно то, что также после создания триггеров создаются элементы в 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-ть последних ошибок с подробной информацией в виде таблицы.
Полный текст возможного скрипта:
// Если ошибок не произошло, считываем сведения из файла и удаляем его
if ($information === 0)
{
$information = file_get_contents(«eventquery.msg»);
unlink(«eventquery.msg»);
}
}
//формируем сообщение администратору
$text_message = «Windows alert:\r\n Information about is: «.implode(» «,$argv);
//Отправляем оповещения обслуживающему персоналу
$to = ‘[email protected]’;
$subject = ‘AAAaaaaA!!!!Erooorrr!!!Erooorr!!!Help my!!!’;
$headers = ‘From: [email protected]’ . «\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», заданный пользователем журнал и журнал каталога.