2013-04-02 102 views
0

我希望通過電子郵件提醒服務頁面花費的時間超過10秒。由於這是一個封閉的系統,我無法使用外部監視器。來自Powershell日誌文件的警報

這是我想看的日誌文件的一個片段。

02-Apr-2013 10:19:50 com.domain.service.core.actions.aaa.GetInfo handleAction 
SEVERE: Post call to Widget Service Request WS 
02-Apr-2013 10:19:50 com.domain.service.core.actions.aaa.GetInfo handleAction 
SEVERE: ERROR: cannot attach result to XML doc 
02-Apr-2013 10:19:50 org.apache.jsp.run _jspService 
INFO: 35 | | | ffffHM6Ly8qLmhhcnJvdy5nb3YudWsv | page1 - time = 7905 ms 
02-Apr-2013 10:19:55 org.apache.jsp.run _jspService 
INFO: 35 | | | ODeeeeeeM6Ly8qLmhh45y4y55YudWsv | summary - time = 7800 ms 
02-Apr-2013 10:19:56 org.apache.jsp.run _jspService 
INFO: 35 | | | ODeeeeeeM6Ly8qLmhh45y4y55YudWsv | page2 - time = 3430 ms 
02-Apr-2013 10:19:56 org.apache.jsp.run _jspService 
INFO: 35 | | | ODeeeeeeM6Ly8qLmhh45y4y55YudWsv | page1 - time = 4210 ms 
02-Apr-2013 10:19:56 org.apache.jsp.run _jspService 
INFO: 35 | | | ODeeeeeeM6Ly8qLmhh45y4y55YudWsv | page3 - time = 4370 ms 
02-Apr-2013 10:19:56 org.apache.jsp.run _jspService 
INFO: 35 | | | ODeeeeeeM6Ly8qLmhh45y4y55YudWsv | page1 - time = 5708 ms 
02-Apr-2013 10:19:56 com.domain.service.netServ.netServSTUFF createSession 
INFO: creating session. token: xxxxxx 
02-Apr-2013 10:19:56 com.domain.service.netServ.netServSTUFF createSession 
INFO: creating session. encrypted token: xxxxxx 
02-Apr-2013 10:19:56 com.domain.service.core.actions.user.CreateNetsolSession handleAction 
INFO: netServ Token: GisLCpQwnMrMEWa5bHuQQw++ 
02-Apr-2013 10:19:57 org.apache.jsp.run _jspService 
INFO: 35 | | | ODeeeeeeM6Ly8qLmhh45y4y55YudWsv | home - time = 14000 ms 

我想通過電子郵件發送給我的是滿足閾值的日期和時間以及加載頁面的時間。

在此先感謝!

+0

我不知道如何讀取日誌文件。你是在看一些出現在某些行開頭的'02-Apr-2013 10:19:50'的時代嗎? –

+0

嘿,感謝您的評論。是的,這有點混亂。我想知道的唯一線路是從2013年4月2日10:19:57開始,並結束... |家庭時間= 14000毫秒。它是一個Tomcat日誌,它似乎將事情分成兩行。 time = xxxx是我需要監控的。 – jetgerbil

回答

1

如果我得到這個更正你的Tomcat日誌使用2行purr事件。

下面是PowerShell的一些行,它將掃描整個日誌文件一次,併爲每個home - time大於10秒的實例發送一封電子郵件。

$file = Get-Content tomcatlog.txt 

$lines = $file.Count 
for($i=0;$i-lt$lines;$i++){ 

#scaning the file for strings like "home - time = #### ms" 
if($file[$i] -like '*home - time = * ms'){ 

     #The date will be on the previous line 
     $date = $file[$i-1].Substring(0,20) 

     #Get the Milliseconds 
     $time_index = $file[$i].LastIndexOf('=') + 2 
     $time = [int]($file[$i].Substring($time_index).Replace(' ms','')) 

     #Calculate the seconds 
     $seconds = $time/1000 

     "Line $i`: On $date the time is took to load was $sec seconds" 

     if($seconds -ge 10){ 
      Send-MailMessage ` 
      -To 'Michael Bluth <[email protected]>' ` 
      -From 'Bob Loblaw <[email protected]>' ` 
      -Subject 'Tomcat' ` 
      -Body "Line $i`: On $date the time is took to load was $sec seconds" ` 
      -SmtpServer 'smtp.bobloblaw.com' 
     } 
    } 
} 

現在,從您的問題聽起來像你想要做一些實時監測這個日誌文件。因此,無論何時將新事件添加到日誌中,並且home - time = 11000 ms大於10秒,都要發送電子郵件。如果您只是一天運行此腳本,您將從前一天獲取重複的電子郵件,因爲日誌文件是相同的。

現在,如果您在每天的開始以及當天結束時創建了一個新的日誌文件,那麼您將運行該腳本,這會改變事情。因此,在腳本結尾處,您可以添加一行來重命名日誌文件Rename-Item -Path C:\tomcatlog.txt -NewName "$(Get-Date -UFormat %y%m%d)_tomcatlog.txt",並假定Tomcat日誌將由您的服務器重新創建。這樣每天你只能從那天收到郵件。

您可以將重複次數加快至每12小時或每6小時或每1小時。你會積累大量的文件,但它會接近實時。

嘗試2

$new_log_path = 'tomcatlog.txt' 
$old_log_path = 'copy_tomcatlog.txt' 

$lastwritetime = (Get-Item $new_log_path).LastWriteTime 
while($lastwritetime -eq (Get-Item $new_log_path).LastWriteTime){ 
    Start-Sleep -Milliseconds 100 
} 

$newfile = Get-Content $new_log_path 
$oldfile = Get-Content $old_log_path #Just a copy of the old original log file 

#You calculate the difference of what was just written to the file 
$updates = Compare-Object -ReferenceObject $newfile -DifferenceObject $oldfile 

#Copy the file so we can as reference of what already was parsed 
Copy-Item -Path $new_log_path -Destination $old_log_path -Force 

$len = $updates.count 
for($i=0;$i-lt$len;$i++){ 
    #it would be $updates[$i].InputObject instead of $file[$i] 
    ... 
} 

雖然文件的寫入時間不會改變只是睡在100毫秒檢查一次。寫時間確實改變了寫入文件的內容,並僅解析寫入的新信息。

+0

這看起來很棒,而且非常適合瞭解發生了什麼的更好的想法。但是爲了讓你的代碼能夠實時地處於這樣的狀態:http://gallery.technet.microsoft.com/scriptcenter/Powershell-FileSystemWatche-dfd7084b? 另一種我認爲能夠實現的方法是在日誌中用'Checked'這個詞來標記行。然後在代碼中只檢查沒有「檢查」的行,然後在檢查時添加單詞。等待沒有..廢話,這是Windows服務器和Tomcat將鎖定文件..該死的。 – jetgerbil

+0

您可以嘗試獲取'checked'行值所在的行號,您可以將它寫出到另一個文件或XML中,並簡單地從'checked lines'文件中的最後一個條目開始解析文件。 –

+0

@ChristopherRanney這聽起來像是一種實現'實時'解決方案的更簡潔的方式。我將如何去做這件事? – jetgerbil