我正在尝试从日志文件中提取最后n分钟的内容,并根据提取的数据执行另一组操作。我的日志文件如下所示:
2019-01-25 02:45:55,018 [5 - -22d] INFO Server - Some information
2019-01-25 02:45:55,018 [5 - -22d] INFO Server - Some information
2019-02-25 02:45:55,018 [5 - -22d] INFO Server - Some information
2019-02-25 19:09:50,018 [5 - -22d] ERROR IOException Some Error
2019-02-25 02:45:55,018 [5 - -22d] INFO Server - Some information
我创建了一个任务调度程序,它每 1 分钟运行一次,并在最后 1 分钟内检查日志文件中的特定错误并执行下一个操作。这里重要的是时间,我想将当前时间与发生错误的日志文件时间进行比较。我尝试的如下:
$data=Get-Content $log | Select-String -Pattern 'String to search error'
foreach ($line in $data){
$logdate = Get-Date ($line -split ',')[0] -Format 'yyyy-MM-dd HH:mm'
Write-Output $logdate
if($date -eq $logdate){
Write-Output "Some action"
}
}
有没有更好的方法来达到相同的结果?社区可以提供一些信息,因为我对 powershell 不太熟悉吗?还尝试了各种其他cmdlet"LastWriteTime,Get-Content,regex-等">
还有其他方法可以做到这一点。
将找到的每个日期转换为 DateTime 对象,并与某个参考日期进行比较。使用-like
将搜索限制为仅包含指定搜索词的行。
$referenceTime = (Get-Date '2019-02-25 19:09:00').AddMinutes(-10)
$wildcardSearch = '*ERROR*'
Get-Content -Path 'D:SomeLog.log' |
Where-Object { $_ -like $wildcardSearch -and (Get-Date ($_ -split ',')[0]) -gt $referenceTime }
ForEach-Object {
# do something here, for demo just output the
$_
}
或者,由于日期和时间都是可排序的格式,因此您不必转换为 DateTime。 此演示使用正则表达式-match
来比较搜索词
# the reference time in sortable string format, as are the dates in the log
$referenceTime = '{0:yyyy-MM-dd HH:mm:ss}' -f (Get-Date '2019-02-25 19:09:00').AddMinutes(-10)
# simple words like ERROR do not need escaping, but other search terms might
$regexSearch = [regex]::Escape('ERROR')
Get-Content -Path 'D:SomeLog.log' |
Where-Object { $_ -match $regexSearch -and ($_ -split ',')[0] -gt $referenceTime } |
ForEach-Object {
# do something here, for demo just output the
$_
}
或者,使用最快的方式遍历日志中的行(再次使用正则表达式(:
$referenceTime = '{0:yyyy-MM-dd HH:mm:ss}' -f (Get-Date '2019-02-25 19:09:00').AddMinutes(-10)
$regexSearch = [regex]::Escape('ERROR')
switch -Regex -File 'D:SomeLog.log' {
$regexSearch {
if (($_ -split ',')[0] -gt $referenceTime) {
# do something here, for demo just output the line
$_
}
}
}
请确保以管理员身份运行 Powershell 脚本,并在首次运行服务之前启动脚本。
并且以下代码将在出现"错误IOException"时不断重新启动服务
Get-Content -Tail 0 -Path $log -Wait | % {
if($_ -like "*ERROR IOException*"){ # use * as wildcards
write-host $_ -ForegroundColor Red
write-host Restart your service
Restart-Service -Name "__NAME OF YOUR SERVICE__" -Force
}
}