3

所要時間が 999 ミリ秒を超えるリクエストの正確な数を取得しようとしています。このスクリプトを使用してみました:

http://wingleungchan.blogspot.com/2011/04/parsing-iis-logs-with-powershell.html

Powershell で整数ベースの IIS(W3C) フィールドをソートする効果的な方法はありますか?

参考までに: Windows 2008 を実行しています。Log Parser の使用を提案しないでください。ありがとう!

4

2 に答える 2

1

インポート-Iis-ログ

質問の賛成コメントによって投稿された役立つリンク ( https://poshcode.org/2574 ) が壊れているため、Web ページの元のコンテンツ (PowerShell スクリプト) を以下に示します (誰かの役に立つ場合に備えて)。

Import-Iis-Log 作成者: Mark Shevchenko

W3C 形式で保存された IIS*logファイルを読み込みます。

このImport-Iis-Logコマンドレットは、IIS*logファイル (W3C 形式で保存) からデータを読み取り、そのデータを Windows PowerShell コンソール内に表形式で表示する方法を提供します。

パラメーター:

  • Path(文字列、必須、位置 = 0、パイプラインからの値、null 以外、空でない) インポートする IIS *.log ファイルへのパスを指定します。Import-Iss-Log へのパスをパイプすることもできます。

  • Delimiter(string, position = 1, not null, not empty) IIS *log ファイルでプロパティ値を区切る区切り文字を指定します。デフォルト値はスペースバーです。

  • Encoding(Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding) IIS *.log ファイルの文字エンコード。デフォルト値は UTF8 です。

コマンドレットは、次のプロパティを持つパイプライン オブジェクトに出力します。

DateTime(System.DateTime) ログの「日付」と「時刻」の値を組み合わせたもの。

ClientHost(System.Net.IpAddress) ログの「c-ip」値。

UserName(文字列または匿名ユーザーの場合は $null) ログの「cs-username」値。

Service(文字列) ログの「s-sitename」値。

Machine(文字列) ログの「s-computername」値。

ServerIp(System.Net.IpAddress) ログの「s-ip」値。

ServerPort(int) ログの「s-port」値。

Method(文字列) ログの「cs-method」値。

ScriptPath(文字列) System.Web.HttpUtility.UrlDecode でデコードされたログの「cs-uri-stem」値。

QueryString(クエリ文字列のない HTTP 要求の文字列または $null) System.Web.HttpUtility.UrlDecode でデコードされたログの「cs-uri-query」値。

ServiceStatus(int) ログの「sc-status」値。

ServiceSubStatus(int) ログの「sc-substatus」値。

Win32Status(int) ログの「sc-win32-status」値。

BytesSent(System.UInt64) ログの「sc-bytes」値。

BytesRecived(System.UInt64) ログの「cs-bytes」値。

ProcessingTime(int) ログの「所要時間」の値。

ProtocolVersion(文字列) ログの「cs-version」値。

Host(Host ヘッダーのない HTTP 要求の場合は $null の文字列) ログの「cs-host」値。

UserAgent(User-Agent ヘッダーのないリクエストの場合は文字列または $null) ログの「cs(User-Agent)」値。

Cookie(Cookie を使用しないリクエストの場合は文字列または $null) ログの「cs(Cookie)」値。

Referer(リファラーのないリクエストの場合は文字列または $null) System.Web.HttpUtility.UrlDecode でデコードされたログの「cs(Referer)」値。

param
(
    [Parameter(
        Mandatory=$true,
        Position = 0,
        ValueFromPipeline=$true,
        HelpMessage="Specifies the path to the IIS *.log file to import. You can also pipe a path to Import-Iss-Log."
    )]
    [ValidateNotNullOrEmpty()]
    [string]
    $Path,
    
    [Parameter(
        Position = 1,
        HelpMessage="Specifies the delimiter that separates the property values in the IIS *.log file. The default is a spacebar."
    )]
    [ValidateNotNullOrEmpty()]
    [string]
    $Delimiter = " ",
    
    [Parameter(HelpMessage="The character encoding for the IIS *log file. The default is the UTF8.")]
    [Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding]
    $Encoding = [Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding]::UTF8
)
    
begin
{
    $fieldNames = @()
    
    $output = New-Object Object
    Add-Member -InputObject $output -MemberType NoteProperty -Name "DateTime" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "ClientHost" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "UserName" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "Service" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "Machine" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "ServerIp" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "ServerPort" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "Method" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "ScriptPath" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "QueryString" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "ServiceStatus" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "ServiceSubStatus" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "Win32Status" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "BytesSent" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "BytesRecived" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "ProcessingTime" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "ProtocolVersion" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "Host" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "UserAgent" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "Cookie" -Value $null
    Add-Member -InputObject $output -MemberType NoteProperty -Name "Referer" -Value $null
}

process
{
    foreach($line in Get-Content -Path $Path -Encoding $Encoding)
    {
        if($line.StartsWith("#Fields: "))
        {
            $fieldNames = @($line.Substring("#Fields: ".Length).Split($Delimiter));
        }
        elseif(-not $line.StartsWith("#"))
        {
            $fieldValues = @($line.Split($Delimiter));
            
            for($i = 0; $i -lt $fieldValues.Length; $i++)
            {
                $name = $fieldNames[$i]
                $value = $fieldValues[$i]
                
                switch($name)
                {
                "date" { $output.DateTime = [DateTime]::Parse($value) }
                "time" { $output.DateTime += [TimeSpan]::Parse($value) }
                "c-ip" { $output.ClientHost = [System.Net.IPAddress]::Parse($value) }
                "cs-username" { $output.UserName = if($value -eq '-') { $null } else { $value } }
                "s-sitename" { $output.Service = $value }
                "s-computername" { $output.Machine = $value }
                "s-ip" { $output.ServerIp = [System.Net.IPAddress]::Parse($value) }
                "s-port" { $output.ServerPort = [int]$value }
                "cs-method" { $output.Method = $value }
                "cs-uri-stem" { $output.ScriptPath = [System.Web.HttpUtility]::UrlDecode($value) }
                "cs-uri-query" { $output.QueryString = if($value -eq '-') { $null } else { [System.Web.HttpUtility]::UrlDecode($value) } }
                "sc-status" { $output.ServiceStatus = [int]$value }
                "sc-substatus" { $output.ServiceSubStatus = [int]$value }
                "sc-win32-status" { $output.Win32Status = [BitConverter]::ToInt32([BitConverter]::GetBytes([UInt32]($value)), 0) }
                "sc-bytes" { $output.BytesSent = [UInt64]$value }
                "cs-bytes" { $output.BytesRecived = [UInt64]$value }
                "time-taken" { $output.ProcessingTime = [int]$value }
                "cs-version" { $output.ProtocolVersion = $value }
                "cs-host" { $output.Host = if($value -eq '-') { $null } else { $value } }
                "cs(User-Agent)" { $output.UserAgent = if($value -eq '-') { $null } else { $value } }
                "cs(Cookie)" { $output.Cookie = if($value -eq '-') { $null } else { $value } }
                "cs(Referer)" { $output.Referer = if($value -eq '-') { $null } else { [System.Web.HttpUtility]::UrlDecode($value) } }
                }
            }
            
            Write-Output $output
        }
    }
}

ソース: https://web.archive.org/web/20170430094952/https://poshcode.org/2574

于 2021-03-18T09:35:24.927 に答える
0

ConvertFrom-Csv はかなりうまく機能します。コメント行を取り除き、ヘッダーのリストを提供する必要があります。

$headers @("Date", "Time", ..., "TimeTaken")
Get-Content "u_ex130815.log" | select -Skip 4| ConvertFrom-Csv -Delimiter " " -Header $headers | ? timetaken -gt 999
于 2014-01-08T21:39:26.507 に答える