
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.
No comments yet.