Analizowanie logów IIS za pomocą PowerShell

By Podstawy, PowerShell

Analizowanie logów IIS za pomocą PowerShell

Zobacz jak szybko zmienić logi serwera Internet Information Services (IIS) w PSCustomObject. Dzięki temu dalsze analizowanie informacji o żądaniach do serwera IIS to czysta przyjemność 😉

Na początku (4 wiersz) każdego plik logu IIS znajdziemy listę zdefiniowanych pól. Wykorzystując ją wraz z ConvertFrom-Csv, otrzymamy logi w postaci obiektów w PowerShell.

$Path = 'C:\inetpub\logs\LogFiles\x\u_ex201227.log'
$Headers = ((Get-Content $Path -TotalCount 4)[-1]).Remove(0, 9).Split(' ')
$IISLogs = Get-Content $Path | ConvertFrom-Csv -Delimiter ' ' -Header $Headers

Na tak pobranych logach IIS możemy dowolnie pracować, używając poleceń PowerShell do przeszukiwania, grupowania, sortowania, eksportowania itd.

# wylistowanie requestów z statusem http 404
$IISLogs | Where-Object sc-status -eq '404' | Select c-ip, sc-status, cs-method
 
# pogrupowanie po adresie ip klienta
$IISLogs | Group-Object -Property c-ip | Sort-Object Count -Descending
 
# pogrupowanie pod kątem kodu odpowiedzi http
$IISLogs | Group-Object -Property sc-status | Sort-Object Count -Descending

Niby podsumowanie

To byłoby na tyle, ale myślę, warte uwagi i dodatkowych kilka słów jest przygotowanie nagłówka dla ConvertFrom-Csv a konkretnie:

((Get-Content $Path -TotalCount 4)[-1]).Remove(0, 9).Split(' ')

🎓 TotalCount przydało się do ograniczenia ilość pobranych wierszy. Get-Content zwraca tablicę, więc indeksem [-1] pobieram ostatni wiersz ([-2] pobierze przed ostatni, [-3] przed przed, itd.), z którego usuwam to, co zbędne (#Fields: ). Na końcu metodą Split(), ciąg znaków zamieniam na tablicę.

(Get-Content $Path -TotalCount 4)
#Software: Microsoft Internet Information Services 8.0
#Version: 1.0
#Date: 2021-01-01 02:42:48
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
 
(Get-Content $Path -TotalCount 4)[-1]
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
 
((Get-Content $Path -TotalCount 4)[-1]).Remove(0, 9)
# date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
 
((Get-Content $Path -TotalCount 4)[-1]).Remove(0, 9).Split(' ')
# date
# time
# s-ip
# cs-method
# cs-uri-stem
# cs-uri-query
# s-port
# cs-username
# c-ip
# cs(User-Agent)
# cs(Referer)
# sc-status
# sc-substatus
# sc-win32-stat

Jeśli znalazłeś coś przydatnego w tym wpisie, to daj znać w komentarzu.

22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

No comments yet.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close