0

Get-EventLogイベント60056006、および6008リモート サーバーの検索に使用する Powershell スクリプトがあります。少し操作した後、結果を配列で返します。

$eventData += Get-EventLog -computerName $server_name -LogName system `
-After $prevMonthBegin -Before $prevMonthEnd |      
  Where-Object `
  { $_.eventid -eq 6005 -OR $_.eventID -eq 6006 -OR $_.eventID -eq 6008 } | 
  Select timegenerated, eventid, message, index, recordid | sort-object timegenerated

結果をループし、フィールドにdownorを割り当てて、再度並べ替えます。up$eventData.messagetimegenerated

$eventData | Sort-Object timegenerated | format-table

TimeGenerated EventID メッセージ インデックス
------------- ------- ------- ----- --------
8/3/2014 5 :30:02 AM 6006 ダウン 0 2014 年 8 月 3 日
5:30:47 AM 6005 アップ 0
2014 年 8 月 24 日 5:31:00 AM 6005 アップ 0
2014/8/31 2:34:59 AM 6008 ダウン 1
2014/8/31 5:30:04 AM 6006 ダウン 0
2014/8/31 5:30:59 AM 6005 アップ 0
2014/8/31 5:36 :26 AM 6005 アップ 0

TimeGeneratedこれらの結果から新しい配列を作成し、上下のペアに配置するにはどうすればよいですか? 配列の最初のイベントが である場合は無視することをお勧めします (そのため、ペアにはup常に存在します) が、これを回避することができます。上記の出力例のように、2 つの連続したorイベントが発生しないことがより重要です。downupdownup

イベントを反復処理して10(またはupdown) の間で一時変数を切り替えることを考えていましたが、それは不格好なようで、何も機能しません。そんなに難しいことではないはずですが、それが私が助けを求めている理由です。より多くのコードを提供することが役立つかどうか教えてください。かなりの量があり、そのページを単にダンプしたくありませんでした。

これは、私が望む配列のフォーマットの例です。私が使用している方法では、これらのイベントを 12121212 としてペアにし、イベントの種類を調べません。upしたがって、上記の例では、2 つの(6005) イベントがあったため、最後のイベント ペアは存在しないダウンタイムを計算します。

Downtime            Uptime              CrashEvent?
8/3/2014 5:30:02 AM  8/3/2014 5:30:47 AM 0
8/24/2014 5:31:00 AM 8/31/2014 2:34:59 AM 0
8/31/2014 2:34:59 AM 8/31/2014 5:30:04 AM 1
8/31/2014 5:30:59 AM 8/31/2014 5:36:26 AM 0
4

2 に答える 2

3

OK、これは、反対のタイプの次のイベントの前にダウンまたはアップイベントの最後を選択する必要があります(アップの前の最後のダウン、ダウンの前の最後のアップ)。基本的に、システムがダウンするたびに、連続して複数ある場合は最後のアップタイム/ダウンタイム通知を使用して、システムが復旧した時刻と一致させます。「連続した重複イベントタイプの最初のものを破棄する」全体が間違っていると思いますが、これはまさにそれを行います。

Noah Sparks から複製されたイベント コレクションで、Select 引数が少し削除されています。次に、ダウンタイム イベントが発生するたびにカスタム オブジェクトを作成するスイッチに入り、各アップタイム イベントのアップタイムを設定し、次のダウンタイム イベントが発生するたびにそれを出力して、最初からやり直します。

$Events = Get-EventLog -LogName system  |      
    Where-Object { $_.eventid -eq 6005 -OR $_.eventID -eq 6006 -OR $_.eventID -eq 6008 } |
        Select timegenerated, eventid | sort-object timegenerated
$record=$null
$Output = Switch($Events){
    {$_.EventID -match "600(6|8)"}{if(![string]::IsNullOrEmpty($Record.up)){$record}
                                   $Record=[pscustomobject][ordered]@{
                                       'Down'=$_.timegenerated
                                       'Up'=$null
                                       'Expected'=If($_.EventID -eq 6006){$true}else{$false}
                                   }}
    {$_.EventID -eq "6005"}{$Record.Up = $_.TimeGenerated}
}
$Output += $record
$Output

個人的には、ダウンタイム イベントが発生した後でも最初のアップタイムを使用しますが、それは私だけです。それには、いくつかの異なるコーディングが必要です。とにかく、その結果は次のようになります (私自身のイベント ログ エントリを使用)。

Down                           Up                                Expected 
----                           --                                -------- 
11/20/2013 8:47:42 AM          11/20/2013 8:49:11 AM                 True 
11/20/2013 3:50:14 PM          12/13/2013 9:14:52 AM                 True 
12/13/2013 9:26:21 AM          12/13/2013 9:27:42 AM                False 
12/13/2013 3:40:07 PM          12/13/2013 3:41:31 PM                 True 
1/9/2014 1:13:31 PM            1/16/2014 12:38:08 PM                 True 
1/16/2014 12:39:21 PM          1/16/2014 12:48:44 PM                 True 

そこの 2 番目のリストを見ると、私のコンピューターが 11/20 から 12/13 までダウンしていなかったことがわかりますが、一連の重複の最初を破棄したことがわかります。そうしないと、システムがダウンしてからわずか 1 分後に再起動することが示されます。

于 2014-09-29T22:30:29.100 に答える
2

重複したエントリをスキップする方法についての回答を次に示します。ただし、照会しているイベントを調整する必要がある可能性があります。そうしないと、ダウン/アップ状態が同時に発生することになります。

$Events = Get-EventLog -LogName system  |      
Where-Object { $_.eventid -eq 6005 -OR $_.eventID -eq 6006 -OR $_.eventID -eq 6008 } |
Select timegenerated, eventid, message, index, recordid | sort-object timegenerated


[array]$FullObj = [pscustomobject] @{
        'Time' = ''
        'Status' = ''
        'Message' = ''
        }

Foreach ($Event in $Events)
{ 
    If ($Event.Message -eq 'The Event log service was started.' -and $fullobj.status[-1] -ne 'UP')
    {
        [array]$FullObj += [pscustomobject] @{
        'Time' = $Event.TimeGenerated
        'Status' = 'UP'
        'Message' = $Event.Message
        }
    }
    Elseif ($fullobj.status[-1] -eq 'UP' -and $fullobj.Message[-1] -notlike "The previous system shutdown*")
    {
        [array]$FullObj += [pscustomobject] @{
        'Time' = $Event.TimeGenerated
        'Status' = 'DOWN'
        'Message' = $Event.Message
        }
    }
}

$FullObj | select time,status
于 2014-09-29T21:30:39.037 に答える