Разбираем журнал (логи) ISA Server: PowerShell + LogParser
Возникла банальная задача – проверить по журналам ISA сервера, кто конкретно имел доступ к конкретному url за последние несколько месяцев. Логи текстовые (формат W3C), размеры их огромные, поэтому руками решать задачу не хочется, решил использовать LogParser и PowerShell.
Сценарий пока не оформлял должным образом, не судите строго, но его рабочая версия выглядит следующим образом:
ImportSystemModules Import-Module '.\ITG.Wrapper\ITG.Wrapper' # -force Import-Module '.\ITG.LogParser\ITG.LogParser' # -force Write-Progress -activity 'Importing modules...' -completed -status 'All done.' Enter-ITGScript -activity 'Анализ журналов ISA сервера'; $ErrorActionPreference = 'Stop' trap { Write-CurrentException($_); } [string]$uri = 'http://www.umvd53.ru/information/internet-priemnaya.html'; [string]$logPrefix = 'X:\AMF\Logs\ISALogs\WEBEXTD'; [string]$logSuffix = '.log'; # дата, за которую будем проводить анализ [System.DateTime]$logDate = (Get-Date); $dates = 0..-20 ` | %{ $logDate.AddDays($_) } ; $dates ` | forEach-Object ` -begin { [int]$logIndex = 0; write-progress ` -id 10 ` -activity $scriptActivity ` -currentOperation $scriptActivity ` -status "Анализ журнала ISA сервера" ` -percentcomplete 0 } ` -process { $logDate = $_; $logFile = "$LogPrefix$($logDate.ToString("yyyyMMdd"))$LogSuffix"; write-progress ` -id 10 ` -activity $scriptActivity ` -status "Анализ журнала" ` -currentOperation "$($logDate.ToString("dd.MM.yyyy")) ($($logIndex+1) из $($dates.count))" ` -percentcomplete ($logIndex/$dates.count*100) ` ; Get-LPRecordSet ` -query "SELECT * FROM $logFile WHERE cs-uri LIKE '$uri%'" ` -inputType 'W3C' ` ; $logIndex += 1; } ` -end { write-progress ` -id 10 ` -activity $scriptActivity ` -status "Завершён анализ журнала ISA сервера." ` -completed ` ; } ` | out-gridView ` ; Exit-ITGScript;
Это его полная версия, с красивыми progress bar. Кратко же он будет выглядеть следующим образом:
ImportSystemModules Import-Module '.\ITG.Wrapper\ITG.Wrapper' Import-Module '.\ITG.LogParser\ITG.LogParser' Write-Progress -activity 'Importing modules...' -completed -status 'All done.' # дата, за которую будем проводить анализ [System.DateTime]$logDate = (Get-Date); [string]$uri = 'http://www.umvd53.ru/information/internet-priemnaya.html'; [string]$logPrefix = 'X:\AMF\Logs\ISALogs\WEBEXTD'; [string]$logSuffix = '.log'; $dates = 0..-20 ` | %{ $logDate.AddDays($_) } ` | %{ $logDate = $_; $logFile = "$LogPrefix$($logDate.ToString("yyyyMMdd"))$LogSuffix"; Get-LPRecordSet ` -query "SELECT * FROM $logFile WHERE cs-uri LIKE '$uri%'" ` -inputType 'W3C' ` ; } ` | out-gridView ` ;
Этот сценарий даёт нам на выходе окно с возможностью фильтрации результатов на лету, что удобно для быстрого анализа.
Естественно, весь сценарий построен на возможностях LogParser, для которого я использую собственный модуль-обёртку, который уже описывал в статье про мониторинг SMTP сервера. Ищем сам LogParser на сайте Microsoft.
Сценарий разовый, поэтому и не оформлены параметры должным образом. Потребуется повторно – выложу его в исправленном варианте.
Ну и в качестве бонуса – ссылочка на snv хранилище с этим сценарием, для загрузки через TortoiseSVN — tsvn:http://svn.novgaro.ru/svn/Tools/ISA/SelectURLsFromLogs/.
Отзывы » (1)
RSS комментарии
Обратная ссылка
Всё руки не доходят отдельно описать обёртку для LogParser и сам LogParser с его развёртыванием. Достаточно удобное решение, позволяющее выполнять SQL запросы к журналам (текстовым, в базах данных, системных журналам, реестру), причём как из командной строки, так и через COM интерфейс (что я и использовал в обёртке для PowerShell).