Статья размещена автором Бетке Сергей Сергеевич

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"})
"@
    ));
}

Нужен целиком модуль – пишите, выложу.

Опубликовать комментарий

XHTML: Вы можете использовать следующие HTML теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tags Связь с комментариями статьи:
RSS комментарии
Обратная ссылка