В прошлой статье о ErrorLog, были представлены основные способы работы с ним, но для меня их оказалось недостаточно и сегодня я расскажу почему.
Предисловие
Недавно мне пришлось анализировать проблемы одного из серверов и это оказалось не так просто. В логах сервера было множество ошибок авторизации, которые существенно мешали поиску нужных сообщений.
Кроме ошибок авторизации могут и другие сообщения, например, иногда включают логирование успешных подключений к серверу и тд.
Я не знал что именно я ищу, по этой причине штатный фильтр в журнале ошибок не смог мне помочь, тогда я стал искать другое решение.
Работа с ErrorLog как с таблицей
Я решил просто выгрузить, с помощью уже известных мне инструментов, весь ErrorLog в таблицу и исключить все сообщения типа ‘%Login failed%’ и ‘%Error: 18456%’. Обнаружилось что подобных сообщений более 95%. После такой фильтрации я быстро решил проблему.
Пример кода:
-- Создаём таблицу для ErrorLog CREATE TABLE #error_log (d datetime,p nvarchar(50),t nvarchar(max)) -- Вставляем в таблицу данные из ErrorLog INSERT INTO #error_log EXEC sp_readerrorlog -- Выполняем фильтрацию (исключение "шума") SELECT * FROM #error_log WHERE t not like '%Login failed for user%' and t not like '%Error: 18456%'
Обратите внимание, что процедуру sp_readerrorlog я вызываю без параметров. Такой вызов вернёт нам только записи активного журнала, если вам нужно вернуть и старые журналы, то просто укажите количество этих журналов. Например, чтобы вернуть текущий и прошлый ErrorLog можно использовать sp_readerrorlog 2
Замечание
Обратите внимание, что этот способ может выполняться значительное время и, возможно, вы быстрее разберётесь в ситуации без подобных ухищрений.