chciałem zrobić szybką wrzutę na temat odczytywania zdarzeń z logu 'applications and services logs’… i okazuje się, że to całe małe universum XMLowe…
najważniejsze informacje: logi systemowe można czytać łatwo i przyjemnie przy pomocy 'get-EventLog’. jednak kiedy chce się odczytać coś z logów aplikacji zaczynają się schody. jest polecenie 'Get-WinEvent’, jednak mechanizm za nim się kryjący jest okrutnie nieprzyjemny. cała architektura oparta jest na XMLu, w związq z czym jakiekolwiek przeszukiwanie albo jest pop(*^@#!@ne albo niewydajne. przykłady filtrów XML – standardowy i xPath ze strony technet:
# Use FilterXML PS C:\>Get-WinEvent -FilterXML "<QueryList><Query><Select Path='Windows PowerShell'>*[System[Level=3 and TimeCreated[timediff(@SystemTime)<= 86400000]]]</Select></Query></QueryList>" # Use FilterXPath PS C:\>Get-WinEvent -LogName "Windows Powershell" -FilterXPath "*[System[Level=3 and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
w dużym skrócie – jest to zupełnie nieprzydatne w zastosowaniu codziennej administracji ponieważ:
- trzeba nie tyle 'znać’ obsługę XML ale 'mieć ją wkompliowaną w mózg’. jak ktoś z tego korzysta dzień w dzień, to może trzepnie taki kodzik na kolanie, ale jak raz na jakiś czas trzeba coś wyszukać…
- nie da się na stałe zrobić zapytania, ponieważ zdarzenia mają różną strukturę – składają się z różnych elementów. jak to w XML – trzeba 'crawlować’ po elementach, bo ich struktura nie jest z góry znana
- dwie różne metody, dwa totalnie różne zapisy, do tego w żaden sposób nie przystające do reszty PS
a przecież XML można przedstawić za pomocą obiektu… czemu ten wynalazek nie zwraca normalnego, ludzkiego obiektu z atrybutami?
polecam art, w którym można poczytać jak się przez to przegryźć.
a na szybko, bez developerki, może niewydajnie, ale działa:
scenariusz: znaleźć logi hyper-v, w których są wpisy dotyczące maszyny o nazwie 'VMNAME’
Get-WinEvent -ComputerName HYPERVSRVo1 -LogName 'Microsoft-Windows-Hyper-V-VMMS-admin' |? message -like '*VMNAME*'|select timecreated,id,message|fl *
inne pomocnicze polecenia na początek to 'get-WinEvent -listProvider *’ oraz 'get-WinEvent -listLog *’. trzeba jakiś list otwarty do scripting guy’a napisać, żeby ponaciskał na uczłowieczenie dostępu do logów aplikacyjnych… ahhh.. żeby tak czas pozwolił to można własny moduł napisać… /:
eN.