log查詢
This commit is contained in:
164
parseLog.ps1
Normal file
164
parseLog.ps1
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
<#==========================
|
||||||
|
Created Date : 2020-04-22
|
||||||
|
Author : Yaoyuan
|
||||||
|
Memo : 在很大的Log檔中取出所需的資訊
|
||||||
|
==========================#>
|
||||||
|
|
||||||
|
<# 設定日期區間 #>
|
||||||
|
# 開始時間
|
||||||
|
$startDate = Get-Date "2020-04-01"
|
||||||
|
# 結束時間
|
||||||
|
$endDate = Get-Date "2020-04-21"
|
||||||
|
# 間隔
|
||||||
|
$daysToSkip = 1
|
||||||
|
|
||||||
|
<# 如果Log檔是在多個資料夾,可以先設一個Array,然後在之後取得檔名的時候代入 #>
|
||||||
|
$folders = "PAYVENDERAPI01P", "PAYVENDERAPI02P", "PAYVENDERAPI07P"
|
||||||
|
|
||||||
|
|
||||||
|
<# 設定要將結果寫入的檔案 #>
|
||||||
|
|
||||||
|
# 設定檔名 (可以連路徑一起設)
|
||||||
|
$okFile = "success.txt"
|
||||||
|
|
||||||
|
# 如果檔案已經存在,先刪除
|
||||||
|
if (Test-Path $okFile)
|
||||||
|
{
|
||||||
|
Remove-Item $okFile
|
||||||
|
}
|
||||||
|
# 建位新檔
|
||||||
|
New-Item $okFile -ItemType File
|
||||||
|
|
||||||
|
|
||||||
|
$errFile = "fail.txt"
|
||||||
|
if (Test-Path $errFile)
|
||||||
|
{
|
||||||
|
Remove-Item $errFile
|
||||||
|
}
|
||||||
|
New-Item $errFile -ItemType File
|
||||||
|
|
||||||
|
|
||||||
|
# 如果開始時間小於或等於結束時間,就執行
|
||||||
|
while ($startDate -le $endDate) {
|
||||||
|
|
||||||
|
# 取得日期的字串
|
||||||
|
$dateString = $startDate.ToString("yyyy-MM-dd")
|
||||||
|
|
||||||
|
# 多個不同資料夾
|
||||||
|
foreach($folder in $folders)
|
||||||
|
{
|
||||||
|
# 建新檔名
|
||||||
|
$file = "D:\APLog\$($folder)\LogsTemp\$($dateString)\VenderAPI.log"
|
||||||
|
|
||||||
|
# 要找的字串
|
||||||
|
# 在這是 JCICP40Query
|
||||||
|
# Select-String 會把有關鍵字那一串全部輸出成 MatchInfo
|
||||||
|
# 如果有多筆的話,就會是 List<MatchInfo>
|
||||||
|
$matches = Select-String $file -Pattern JCICP40Query
|
||||||
|
|
||||||
|
# 因為每次的查詢都會有一個SessionID,每個查詢會有多筆Log紀錄,
|
||||||
|
# 所以用lastSessionID來判斷是不是要換下一筆的紀錄
|
||||||
|
$lastSessionID = ""
|
||||||
|
|
||||||
|
foreach($line in $matches)
|
||||||
|
{
|
||||||
|
# 將MatchInfo轉成String
|
||||||
|
$strLine = $line.ToString()
|
||||||
|
|
||||||
|
<# step 1: 取得 Session ID #>
|
||||||
|
|
||||||
|
# 用 regular expression 來處理字串
|
||||||
|
$strLine -match 'Ѯ(.{32})Ѯ'
|
||||||
|
|
||||||
|
# 如果上一行 regex match 的結果是 true,就可以用 $matches[] 來取得所需的字串
|
||||||
|
# [0]是全部符合的字串,[n]是第n個group字串
|
||||||
|
$sessionID = $matches[1]
|
||||||
|
|
||||||
|
<# step 2: 用 Session ID 檢查是不是同一個查詢 #>
|
||||||
|
# 因為這次要查詢的log不會多個不用 Session ID 穿插,所以可以單線循序來取得
|
||||||
|
if($sessionID -ne $lastSessionID)
|
||||||
|
{
|
||||||
|
<# step 7: 同一個 Session ID 結束,而且不是第一筆,在這裡幾多筆log的資料組合好寫入檔案 #>
|
||||||
|
if(![string]::IsNullOrEmpty($lastSessionID))
|
||||||
|
{
|
||||||
|
|
||||||
|
# 要寫入的檔案
|
||||||
|
$fileName = $errFile
|
||||||
|
if([string]::IsNullOrEmpty($errMsg))
|
||||||
|
{
|
||||||
|
$fileName = $okFile
|
||||||
|
}
|
||||||
|
|
||||||
|
# 寫入檔案
|
||||||
|
Add-Content $fileName "============ $datetime $folder =============="
|
||||||
|
Add-Content $fileName "SessionID: $sessionID"
|
||||||
|
Add-Content $fileName "----"
|
||||||
|
Add-Content $fileName "timer: $timer"
|
||||||
|
Add-Content $fileName "----"
|
||||||
|
Add-Content $fileName "postData: $postData"
|
||||||
|
Add-Content $fileName "----"
|
||||||
|
Add-Content $fileName "result: $result"
|
||||||
|
Add-Content $fileName "----"
|
||||||
|
Add-Content $fileName "errMsg: $errMsg"
|
||||||
|
Add-Content $fileName ""
|
||||||
|
Add-Content $fileName ""
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# 上一個 Session ID 的資料都處理完了,開始下一筆資料
|
||||||
|
$lastSessionID = $sessionID
|
||||||
|
|
||||||
|
# 清空上一筆的資料
|
||||||
|
$postData = ""
|
||||||
|
$result = ""
|
||||||
|
$errMsg = ""
|
||||||
|
$datetime = ""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# step 3: 取得 Post 的資料
|
||||||
|
$strLine -match 'Post參數「(.+)」'
|
||||||
|
|
||||||
|
$postData = $matches[1]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# step 4: 取得 datetime
|
||||||
|
$strLine -match "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{4}"
|
||||||
|
|
||||||
|
$datetime = $matches[0]
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
#step 5: 取得 result message
|
||||||
|
if($strLine -match '\[restJCICP40QueryResp\]:(.+)')
|
||||||
|
{
|
||||||
|
$result = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
#step 6: 取得 error message
|
||||||
|
if($strLine -match '\[restJCICP40QueryResp.Errmsg\]:(.+)$')
|
||||||
|
{
|
||||||
|
$errMsg = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
#step 7: 取得 timer
|
||||||
|
if($strLine -match 'Timer: \*(.+)\*')
|
||||||
|
{
|
||||||
|
$timer = $matches[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# 下一個日期的 Log
|
||||||
|
$startDate = $startDate.AddDays($daysToSkip)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
50
readme.md
Normal file
50
readme.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
## PowerShell 常用的指令
|
||||||
|
|
||||||
|
|
||||||
|
### Log 查詢
|
||||||
|
|
||||||
|
#### 顯示內容
|
||||||
|
```powershell
|
||||||
|
Get-Content -Path C:\Windows\System32\LogFiles\HTTPERR\httperr1.log
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 分頁顯示內容
|
||||||
|
```powershell
|
||||||
|
Get-Content -Path C:\Windowns\System32\LogFiles\HTTPERR\httperr1.log | Out-Host -Paging
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 顯示最後幾行
|
||||||
|
```powershell
|
||||||
|
Get-Content -Path C:\Windows\Logs\DISM\dism.log -Tail 50
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 持續監控
|
||||||
|
以下指令會先顯示最後5筆,然後持續監控檔案,只要一更新,馬上顯示。
|
||||||
|
```powershell
|
||||||
|
Get-Content -Path C:\Windows\WindowsUpdate.log -Tail 5 -Wait
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### 顯示符合條件的 log
|
||||||
|
以下會顯示最後20筆符合 Drop 的 log 行
|
||||||
|
```powershell
|
||||||
|
Select-String -Path C:\Windows\System32\LogFiles\Firewall\pfirewall.log -Pattern 'Drop' | Select-Object -Last 20
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 多個條件
|
||||||
|
```powershell
|
||||||
|
Select-String -Path C:\Windows\WindowsUpdate.log -Pattern 'error','warning'
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 顯示連同符合條件的上下行
|
||||||
|
以下指令會顯示符合條的的資料行和前面的0行,後面的3行
|
||||||
|
```powershell
|
||||||
|
Select-String -Path C:\Windows\WindowsUpdate.log -Pattern 'error' -Conteext 0,3
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### 查看log檔特定行號間的紀錄
|
||||||
|
以下查詢會顯示 log 檔從 30 到 45 行之間的資料。
|
||||||
|
```powershell
|
||||||
|
Get-Content C:\Windows\debug\netlogon.log | Select-Object -First 30 -Skip 45
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user