如何使用PowerShell扫描SQL Server错误日志(并忽略一些错误)?

时间:2013-11-27 15:59:43

标签: sql-server powershell smo

我需要PowerShell脚本(2.0兼容)来扫描SQL Server 2008 R2及更高版本的错误日志。我需要有一个要搜索的短语列表,以及要排除的短语列表。

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

因此,例如,我想查找ERRORLOG中包含Error:Failed的所有行,但不包括$exclude数组中的行。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你可以在这里找到很多相关信息: Use PowerShell to Parse SQL Server 2012 Error Logs

但是,你要问的一种方法是在设置$ 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}
}

答案 1 :(得分:0)

上面的文章详细介绍了未记录的TSQL版本。

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

我认为你缺少一些参数。 xp_readerrorlog扩展过程采用以下参数。

A - 错误日志文件的数量

B - 1 = SQL Server日志,2 - SQL代理日志

C - 搜索字符串1

D - 搜索字符串2

答案 2 :(得分: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