我需要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
数组中的行。有什么想法吗?
答案 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]}
}
}