SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

イベントログから特定のイベントを抽出

leave a comment

イベントログから特定のイベントを抽出する方法として、2003 までは eventquery.vbs を使用していましたが、今の OS では PowerShell で操作することになるかと思います。
# LogParser / Log Parser Studio を使う方法もありますが。

イベントログを操作するコマンドレットとしては、Get-EventLog と Get-WinEvent がありますが、2008 以降のイベントログを操作する場合は、Get-WinEvent を使っていきます。

Get-WinEvent で [FilterHashTable] / [FilterXML] / [FilterXPath] を使うとログをフィルタすることができますが、意イベントログプロバイダーでフィルタする場合、FilterHashTable では、指定したプロバイダーがローカルに存在している必要があるようですので、他の環境から取得したイベントログを使用する場合には、FilterXML / FilterXPath を使うとよいのかと。
# Get-EventLog | Where-Object だとログのサイズが大きいとパフォーマンスがでないので Get-WinEvent でフィルタするとよいかと。

ローカルに存在するイベントログ プロバイダーは

Get-WinEvent -ListProvider * | Out-GridView

 

で確認できますので、この辺を一度見ておくとよいかもしれないですね。

FilterXPath の条件は、ログをフィルターする際の XML のタブから確認するとよいかと思います。

image

FilterXPath を使ったログのフィルターは以下のようになるかと。

param(
[string]$startdate="2013/12/01" ,
[string]$enddate="2014/01/11"
)
$startdate = [System.TimeZoneInfo]::ConvertTimeToUtc($startdate).ToString("yyyy-MM-ddTHH:mm:ssZ")
$enddate = [System.TimeZoneInfo]::ConvertTimeToUtc($enddate).ToString("yyyy-MM-ddTHH:mm:ssZ")
$filter=@"
*[System
[
(Provider[@Name='Microsoft-Windows-GroupPolicy']
and (Level=4)
and (EventID=1500)
and TimeCreated[@SystemTime>= '$startdate']
and TimeCreated[@SystemTime<= '$enddate'])
or
(Provider[@Name='Service Control Manager']
and (Level=4)
and (EventID=7040)
and TimeCreated[@SystemTime>= '$startdate']
and TimeCreated[@SystemTime<= '$enddate'])
or
(Provider[@Name='volsnap']
and (Level=2)
and (EventID=36)
and TimeCreated[@SystemTime>= '$startdate']
and TimeCreated[@SystemTime<= '$enddate'])
or
(Provider[@Name='MSSQLSERVER']
and (Level=4)
and (EventID=4193)
and TimeCreated[@SystemTime>= '$startdate']
and TimeCreated[@SystemTime<= '$enddate'])
]
]
"@
Get-WinEvent -Path C:tempSystem.evtx -FilterXPath $filter -Oldest -ErrorAction SilentlyContinue | Out-GridView

イベントログの日付は UTC で管理されているようですので、日付を変換しています。

イベントログのフィルタから、XPath を生成した場合、以下のようなパスになります。

*[System
[
Provider[@Name='ACPI' or @Name='Microsoft-Windows-ActionQueue' or @Name='adpahci']
and
(Level=4 or Level=0)
and
( (EventID >;= 100 and EventID <= 200) )
]
]

プロバイダーや ID の条件が AND で繋がれるフィルタになるので、特定のイベントについて ID を指定するため、XPath を少し編集しています。

実行すると以下のようにフィルタされログが表示されます。

image

Get-WinEvent では 2003 までの evt 形式のログも読み込むことができますので、古いサーバーのログをフィルタすることも可能です。

# evt 形式を処理する場合、[-Oldest] のオプションが必須になります。

ただし、evt を Get-WinEvent で処理した場合、メッセージ等は取得できないようですので、イベントの発生を確認するレベルになってしまいますが。この辺の差はイベントログの構造の違いですかね。

image

Share

Written by Masayuki.Ozawa

1月 12th, 2014 at 9:28 pm

Leave a Reply