2017-11-27 2 views
1

네트워크 활동 (tracert, nslookup, ping)을 로그 파일에 기록하는 기본 Powershell 스크립트가 있습니다. 새로운 날짜마다 새 로그 파일이 만들어집니다.Powershell 로그 카운트 오류

오류 발생 정보를 저장하도록 스크립트를 업데이트하고 싶습니다. 가능한 오류 배열이 있는데 (관심이 있습니다) 로그 파일에 정보를 저장할 때 오류가 기록되고 싶습니다. 오류 당 개수 만 기록하십시오. 나는이 양식의 텍스트 파일에 저장 오류 카운트 가지고 확인입니다

: ERROR_NAME 수 | ERROR_NAME 수를 등등 그래서 예를 들면 : 호스트 사용할 수 없음 * 10 | 요청은 * 22 시간 초과 등등

tracert $server >> $logFile 
nslookup $server >> $logFile 
ping $server >> $logFile 
:

$errors = @('error1','error2','error3') 

나는이 같은 로그 파일에 결과를 저장합니다

그래서 나는 오류가있는이 배열이 있다고 가정 해 보자

나는 변수에 출력을 저장하고 배열에 대해 그것을 일치하도록 시도 : 오류의 정확한 숫자는 보고서 파일에서 읽어 그래서 나는 배열 키를 얻는 방법을 알아낼 수 없습니다입니다 무엇

tracert $server >> $logFile 
$data = tracert $server 
if ($null -ne ($errors | ? { $data -match $_ })) { 
    #reading data from report file 
    $data = Get-Content $reportFile 
    $d1 = $data.split('|') 
    $err = @() 
    foreach ($item in $d) { 
     $count = $item.split('*') 
     $err += $count[1] 
    } 
} 

오류가 발생하면 파일 크기를 늘려 파일을 다시 저장할 수 있습니다. 어쩌면 다른 해결책이 있을까요? 나는 어떤 도움이나 힌트를 주셔서 감사합니다.

try{tracert $server >> $logFile} 
catch{$_.Exception.Message} 

이 try 블록에 실제 코드를 삽입하고 실패 할 경우, 다음 블록을 잡기 위해 올 것이다 및 $_.Exception.Message 오류 메시지가 캡처 : 당신이 필요로하는 무엇

답변

0

는 시도/캐치입니다. 전체 오류를 얻으려면 catch 블록에 $Error을 사용할 수 있습니다.

이제 스크립트를 변경하여 if 로직을 제거 할 수 있습니다.

가능한 오류 코드가 있으므로 문자 일치를 수행하여 가능한 원인으로 Switch case을 catch 블록에 넣고 자신의 문장을 넣을 수 있습니다.

0

문자열 조작을 통해 처리해야하는 사용자 지정 출력 형식을 만드는 대신 PowerShell에서 이미 액세스 할 수있는 구조화 된 형식 중 하나를 사용하는 것이 좋습니다. 예 : JSON. 여기

내가이를 작성할 수 있습니다 방법은 다음과 같습니다

Function Out-ErrorLog { 

    [CmdletBinding()] 
    Param(
     [Parameter(ValueFromPipeline=$true)] 
     [String]$Data, 

     [String]$LogPath = '.\error.log', 

     [String[]]$Errors = @('Request Timed Out','Host Not Available') 
    ) 
    Process { 
     If (Test-Path $LogPath) { 
      Write-Verbose "Loading existing error log file from $LogPath.." 
      $ErrorLog = Get-Content $LogPath | ConvertFrom-Json 
     } Else { 
      $ErrorLog = New-Object -TypeName PSObject 
     } 

     ForEach ($Err in $Errors) { 
      $Matches = $Data | Select-String -SimpleMatch $Err -AllMatches 

      If ($Matches) { 
       If (-Not $ErrorLog.$Err) { 
        Write-Verbose "Creating $Err property.." 
        $ErrorLog | Add-Member -MemberType NoteProperty -Name $Err -Value $Matches.count 
       } Else { 
        Write-Verbose "Adding to $Err count.." 
        $ErrorLog.$Err += $Matches.count 
       } 
      } 
     } 

     Write-Verbose "Outputting Errors to $LogPath.." 
     $ErrorLog | ConvertTo-Json | Out-File $LogPath -Encoding UTF8 
    } 
} 

$Server = '1.2.3.4' 

$Data = ping $Server 
$Data >> $LogFile 
$Data | Out-ErrorLog -Verbose 

$Data = tracert $Server 
$Data >> $LogFile 
$Data | Out-ErrorLog -Verbose 

$Data = nslookup $server 
$Data >> $LogFile 
$Data | Out-ErrorLog -Verbose 

내가 코드의 반복에 저장하는 Out-ErrorLog 기능을 작성했습니다. 이것은 파이프 라인에서 $Data을 입력으로 받아 들여 오류를 파일로 기록하고 $Errors의 배열을 테스트/기록하려는 위치에 두 개의 다른 매개 변수 $LogPath이 있습니다.

그런 다음 Test-Path을 사용하여 로그 파일이 이미 존재하는지 확인합니다. 로그 파일이로드되고 Json의 내용을 변환합니다.

그런 다음 ForEach을 사용하여 오류 옵션을 반복하고 제공된 데이터와 비교합니다. 우리는 이것에 Select-String-AllMatches 매개 변수를 사용하여 얼마나 많은 오류가 발생했는지 쉽게 계산할 수 있습니다.

오류가 발생하면 $ErrorLog 개체에 이미 오류가 있는지 확인합니다. 우리가하지 않으면 그 오류에 대한 객체에 새 속성을 만들고 그 값에 값을 부여합니다. 이미 존재했다면 우리는 그것을 증가시킵니다.

루프가 끝나면 결과 ErrorLog 객체가 Json 파일로 출력됩니다.