PowerShell: загрузка журнала SMTP (и не только) за несколько дней
Решения на эту тему уже описывал (ссылки в конце статьи). Однако, хочется предоставить удобные функции для загрузки журналов за диапазон дат с целью последующего анализа. Сделаем!
Итак, хочу получить что-то типа следующего:
# в одну строку $logRecords = -5..-1 | %{ (Get-Date).Date.AddDays($_) } | %{Get-SMTPLogRecords -log (Get-SMTPlog -logDate $_) -first 10} # то же самое, но читабельно $logRecords = ` -5..-1 | %{ (Get-Date).Date.AddDays($_) } ` | %{ ` Get-SMTPLogRecords ` -log (Get-SMTPlog -logDate $_) ` -first 10 ` }
Как уже понятно, таким образом мы должны загрузить журналы за 5 предыдущих дней (по 10 первых записей — просто ради примера). И этот код работает! “Переделанные” под это дело функции модуля LogParser:
function Get-LPRecordSet { param ( [Parameter( Mandatory=$true, Position=0, ValueFromPipeline=$false, HelpMessage="Запрос в SQL синтаксисе Log Parser." )] [string]$query, [Parameter( Mandatory=$false, Position=1, ValueFromPipeline=$false, HelpMessage="Интерфейс типизированного парсера для обрабатываемого журнала." )] $inputType ) if($inputType) { $LPRecordSet = Invoke-LPExecute $query, $inputType; } else { $LPRecordSet = Invoke-LPExecute $query; } $LPRecords = new-object System.Management.Automation.PSObject[] 0; if (-not $LPRecordSet.atEnd()) { $exp = "select-object -property ```n" + (@( ` for ([int]$i = 0; $i -lt $LPRecordSet.getColumnCount(); $i++) { "`t@{name=`"$($LPRecordSet.getColumnName($i))`";expression={`$_.getValue($i);};}"; } ` ) -join ", ```n"); $LPRecords = @( for([int]$i=0; -not $LPRecordSet.atEnd(); $LPRecordSet.moveNext()) { #$LPRecords += Get-LPRecord($LPRecordSet) invoke-expression "`$LPRecordSet.getRecord() | $exp"; $i++; if ($i -gt 20 ) { write-progress ` -id 1000 ` -activity "Загрузка записей журнала" ` -currentOperation "($i)" ` -status "Загрузка записей журнала" }; }); if ($i -gt 20 ) { write-progress ` -id 1000 ` -activity "Загрузка записей журнала" ` -status "Загрузка записей журнала завершена. Загружено $($LPRecordSet.count) записей." ` -completed }; }; $LPRecordSet.Close(); return $LPRecords; } function Get-SMTPLogRecords { param ( [Parameter( Mandatory=$false, Position=0, ValueFromPipeline=$true, HelpMessage="Описатель файла журнала." )] $log = (Get-SMTPlogFileName), [Parameter( Mandatory=$false, Position=1, ValueFromPipeline=$false, HelpMessage="Часть запроса (Where секция) в SQL синтаксисе Log Parser." )] [string]$queryWhere, [Parameter( Mandatory=$false, Position=2, ValueFromPipeline=$false, HelpMessage="Количество первых строк журнала, которые будут загружены." )] [int]$first = 0 ) @(Get-LPRecordSet ( @" SELECT $(if ($first) {"TOP $first"}) TO_TIMESTAMP(TIMESTAMP('$($log.Date.ToString("dd.MM.yyyy"))', 'dd.MM.yyyy'), time) AS FullTime, c-ip AS UserIP, cs-username AS Host, cs-username AS Direction, cs-method AS RequestType, cs-uri-query AS Response, cs-uri-query AS RequestParams, sc-status AS Status FROM $($log.fileName) $(if ($queryWhere) {"WHERE $queryWhere"}) "@ )); }
Нужен целиком модуль – пишите, выложу.
RSS комментарии
Обратная ссылка