【问题标题】:Parsing server start time based on log file根据日志文件解析服务器启动时间
【发布时间】:2017-05-12 21:52:18
【问题描述】:

我正在以下日志文​​件中搜索错误,如果为真,我会收到一封邮件。

(DIAG:GENERAL)(01:02:07 28/12/2016)(FREE MEM.MB:248846)(USER:SYSTEM)(REMOTE:LOCAL)(记录器成功启动...)
(诊断:一般)(01:02:08 28/12/2016)(免费 MEM.MB:248878)(用户:系统)(远程:本地)(============== =========================)
(诊断:一般)(01:02:08 28/12/2016)(免费 MEM.MB:248878)(用户:系统)(远程:本地)(开始
(诊断:一般)(01:02:08 28/12/2016)(免费 MEM.MB:249051)(用户:系统)(远程:本地)(============== =========================)
(DIAG:GENERAL)(01:02:08 28/12/2016)(FREE MEM.MB:249057)(USER:SYSTEM)(REMOTE:LOCAL)(类管理器成功初始化...)
(DIAG:GENERAL)(01:02:08 28/12/2016)(FREE MEM.MB:249069)(USER:SYSTEM)(REMOTE:LOCAL)(WinSock 初始化成功...)
(DIAG:GENERAL)(01:02:08 28/12/2016)(FREE MEM.MB:249069)(USER:SYSTEM)(REMOTE:LOCAL)(线程管理器成功初始化...)
(DIAG:GENERAL)(01:02:08 28/12/2016)(FREE MEM.MB:249067)(USER:SYSTEM)(REMOTE:LOCAL)(事务子系统成功启动...)
(DIAG:GENERAL)(01:04:29 28/12/2016)(FREE MEM.MB:201470)(USER:SYSTEM)(REMOTE:LOCAL)(启动初始化基础索引阅读器...名称:)
(DIAG:GENERAL)(01:04:32 28/12/2016)(FREE MEM.MB:201470)(USER:SYSTEM)(REMOTE:LOCAL)(停止初始化基础索引阅读器...名称:编号:655711255 设置: 655711255 +
(诊断:一般)(01:04:46 28/12/2016)(免费 MEM.MB:200341)(用户:系统)(远程:本地)(...压缩 292527623 / 655711255 % 44.6123)
(诊断:一般)(01:05:03 28/12/2016)(免费 MEM.MB:200357)(用户:系统)(远程:本地)(...压缩 288669002 / 655711255 % 44.0238)
(DIAG:GENERAL)(01:14:35 28/12/2016)(FREE MEM.MB:202999)(USER:SYSTEM)(REMOTE:LOCAL)(RealTimeManager 成功启动...WIZZADOAS)
(诊断:常规)(01:14:35 28/12/2016)(免费 MEM.MB:202999)(用户:系统)(远程:本地)(PersistObjectCache 初始化...COasStudiaFolderObject max = 1)
(诊断:一般)(01:14:35 28/12/2016)(免费 MEM.MB:202999)(用户:系统)(远程:本地)(报表布局管理器初始化...)
(诊断:一般)(01:14:35 28/12/2016)(免费 MEM.MB:202999)(用户:系统)(远程:本地)(报告数据包管理器初始化...)
(DIAG:GENERAL)(01:14:35 28/12/2016)(FREE MEM.MB:202999)(USER:SYSTEM)(REMOTE:LOCAL)(Report Packet Parameter Manager init...)
(DIAG:GENERAL)(01:14:35 28/12/2016)(FREE MEM.MB:202999)(USER:SYSTEM)(REMOTE:LOCAL)(CommandManager 成功初始化...)
(诊断:常规)(01:14:36 28/12/2016)(免费 MEM.MB:202993)(用户:系统)(远程:本地)(PersistObjectCache 初始化...COasHistoryTransactionObject max = 195069)
(DIAG:GENERAL)(01:14:36 28/12/2016)(FREE MEM.MB:202993)(USER:SYSTEM)(REMOTE:LOCAL)(ReferenceManager 成功初始化...)
(诊断:一般)(01:14:36 28/12/2016)(免费 MEM.MB:202993)(用户:系统)(远程:本地)(============== ======================)
(DIAG:GENERAL)(01:14:36 28/12/2016)(FREE MEM.MB:202993)(USER:SYSTEM)(REMOTE:LOCAL)(Server64 成功启动......)
(DIAG:GENERAL)(01:14:36 28/12/2016)(FREE MEM.MB:202993)(USER:SYSTEM)(REMOTE:LOCAL)(退出请输入“q”...)
(DIAG:GENERAL)(01:14:36 28/12/2016)(FREE MEM.MB:202990)(USER:SYSTEM)(REMOTE:LOCAL)(检查日志文件的当前状态)
(诊断:一般)(01:14:36 28/12/2016)(免费 MEM.MB:202987)(用户:系统)(远程:本地)(============== ======================)
(DIAG:XMLRPC)(01:14:37 28/12/2016)(FREE MEM.MB:203014)(USER:SYSTEM)(REMOTE:10.67.125.250:3000)(XmlRpc: 称为成员方法“HandleEvent”。 0)s ] = 1052239)
$a = Get-Content 'D:\log\server.log' | Select-String error

if (!($a -eq $null)) {
    $b = $a | Out-String
    Send-MailMessage -To $me -From $me -Subject "LIVE - Server ERRORs" -Body "$b" -Priority High -SmtpServer $smtp
}

到目前为止,一切都很好。
现在我想知道服务器启动过程需要多长时间。 信息就在那里

(DIAG:GENERAL)(01:02:07 28/12/2016)(FREE MEM.MB:248846)(USER:SYSTEM)(REMOTE:LOCAL)(记录器成功启动...)

(DIAG:GENERAL)(01:14:36 28/12/2016)(FREE MEM.MB:202993)(USER:SYSTEM)(REMOTE:LOCAL)(Server64 成功启动....)

但我不知道如何用 RegEx 解析/比较它。

非常感谢您的帮助,因为 RegEx 不是那么容易理解,老实说。

【问题讨论】:

  • 所以你不需要 100% 的正则表达式,因为它看起来字符位置是一致的,所以如果你愿意,你可以使用 -like 定位行,然后使用子字符串拉出日期。但是,如果您对学习 RegEx 感兴趣,请将您的日志粘贴到 regexr.com 并使用正则表达式字符串,直到您获得所需的匹配项(左侧的参考库也很棒)

标签: regex powershell scripting


【解决方案1】:

通过() 拆分行并获取第三件事以获取日期时间,然后将其解析为具有以下模式的PowerShell日期时间:小时:分钟:秒/日/月/年 em>:

$LoggerTime = Select-String 'logger successfully started' 'D:\log\server.log' | ForEach-Object { 

    [datetime]::ParseExact($_.Line.split('()')[3], 'HH:mm:ss dd/MM/yyyy', $null) 

}

$Server64Time = Select-String 'server64 successfully started' 'D:\log\server.log' | ForEach-Object { 

    [datetime]::ParseExact($_.Line.split('()')[3], 'HH:mm:ss dd/MM/yyyy', $null) 

}


Write-Host Server Startup took: ($Server64Time - $LoggerTime)

# e.g. Server Startup took: 00:12:29

当您减去两个[datetimes] 时,您会得到一个持续时间为[TimeSpan]

注意。假设每一行在日志中只出现一次。

【讨论】:

    【解决方案2】:

    你需要做两件事:

    • 从日志文件中提取匹配的行:

      $log   = Get-Content 'D:\log\server.log'
      $line1 = $log -match 'Logger successfully started'
      $line2 = $log -match 'Server64 successfully started'
      
    • 从每一行中提取时间戳:

      $ts = $line -replace '.*\((\d{2}:\d{2}:\d{2} \d{2}/\d{2}/\d{4})\).*', '$1'
      

      将时间戳转换为DateTime 值:

      $culture = [Globalization.CultureInfo]::InvariantCulture
      $d = [DateTime]::ParseExact($ts, 'HH:mm:ss dd\/MM\/yyyy', $culture)
      

      并计算两个值的差:

      $startupTime = ($d2 - $d1).TotalMinutes
      

    【讨论】:

    • 您好 Ansgar,感谢您的帮助。我让它像这样工作:
    • 我得到了它的工作,但结果是 12:48 而不是 12:29(如何在此处添加我的代码?)
    • @PaulSmith 12.48 分钟是 12 分 29 秒(12:29 或 12'29")的十进制表示。
    • 感谢您的帮助,不胜感激!
    猜你喜欢
    • 2020-05-21
    • 1970-01-01
    • 2011-01-22
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多