2013-11-27 50 views
1

我需要一個PowerShell腳本(2.0兼容)來掃描SQL Server 2008 R2及更高版本的錯誤日誌。我需要有一個要搜索的短語列表以及要排除的短語列表。如何使用PowerShell掃描SQL Server錯誤日誌(並忽略一些錯誤)?

param ([String]$instanceName=$(throw "Instance name was not supplied")) 

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')|Out-Null; 
$sqlServer = new-object ("Microsoft.SqlServer.Management.Smo.Server") $instanceName; 
$r = $sqlServer.ReadErrorLog(); 

$find = "Error:","Failed"; 
$exclude = "Error: 0x2098"; 

# need to do something with $r here and involve $find and $exclude 

因此,例如我想找到包含Error:Failed錯誤日誌的所有行,但不包括$exclude數組中的人。有任何想法嗎?

回答

1

你可以在這裏找到很多關於這個的信息: Use PowerShell to Parse SQL Server 2012 Error Logs

但是,你要求做的一種方法是通過過濾re當設置$ r

$r = $sqlServer.ReadErrorLog() | ? { $_.Text -match 'error' -OR $_.text -match 'Failed' -and $_text -notmatch "Error: 0x2098"} 

你可以遍歷每個列表並相應地更新$ r,像下面的東西應該讓你開始。

Foreach($ExcludeText in $exclude){ 
    $r = $r | ? {$_.text -notmatch $ExcludeText} 
} 

Foreach($IncludeText in $find){ 
    $r = $r | ?{$_.text -match $IncludeText} 
} 
+0

謝謝,但查找和排除數組可能會增長,我想知道如何做到這一點與數組,任何想法呢? –

+0

我增加了另一個例子,我認爲它更接近你所問的內容。 – malexander

0

上述文章詳細介紹了未公開的TSQL版本。

http://www.mssqltips.com/sqlservertip/1476/reading-the-sql-server-log-files-using-tsql/

我認爲你缺少一些參數。 xp_readerrorlog擴展過程採用以下參數。

A - 錯誤日誌文件的數量

乙 - 1 = SQL Server日誌,2 - SQL代理日誌

Ç - 搜索串1

d - 搜索字符串2

+0

謝謝,但我沒有興趣在T-SQL的解決方案,並且該腳本沒有做什麼,我想在T-SQL反正。 –

0

這是您問的PowerShell解決方案。

我認爲和/或是重要的?

$srv = new-Object Microsoft.SqlServer.Management.Smo.Server("(local)") 

$d = $srv.ReadErrorLog(0) 
foreach ($r in $d.Rows) 
{ 
    if (($r['Text'] -match 'Error:' -and $r['Text'] -notmatch 'Error: 0x2098') 
     -or $r['Text'] -match 'Failed:') 
    { 

    Write-Host "============================================" 
    Foreach ($c in $d.Columns) 
    { Write-Host $c.ColumnName "=" $r[$c]} 
    } 
} 

enter image description here