Rozpoczynanie pracy z zapytaniami dzienników w dziennikach usługi Azure Monitor
W tym artykule opisano podstawy pisania zapytań dzienników w dziennikach usługi Azure Monitor, w tym instrukcje:
- Tworzenie struktury zapytania.
- Sortuj wyniki zapytania.
- Filtruj wyniki zapytania.
- Określ zakres czasu.
- Uwzględnij lub wyklucz kolumny w wynikach zapytania.
- Definiowanie i używanie pól niestandardowych.
- Agregowanie i grupowanie wyników.
W stosownych przypadkach artykuł zawiera przykłady wykonywania zapytań dotyczących danych przy użyciu zarówno język zapytań Kusto (KQL) jak i trybu prostego usługi Log Analytics.
Uwaga
Jeśli zbierasz dane z co najmniej jednej maszyny wirtualnej, możesz wykonać to ćwiczenie we własnym środowisku. W innych scenariuszach użyj naszego środowiska demonstracyjnego, które zawiera mnóstwo przykładowych danych.
Samouczek wideo
Uwaga
W tym filmie wideo przedstawiono starszą wersję interfejsu użytkownika, ale zrzuty ekranu w tym artykule są aktualne i odzwierciedlają bieżący interfejs użytkownika.
Wymagane uprawnienia
Musisz mieć Microsoft.OperationalInsights/workspaces/query/*/read
uprawnienia do obszarów roboczych usługi Log Analytics, które wykonujesz, zgodnie z wbudowaną rolą czytelnika usługi Log Analytics.
Tworzenie struktury zapytania
Zapytania mogą rozpoczynać się od nazwy tabeli lub search
polecenia. Dobrym pomysłem jest rozpoczęcie od nazwy tabeli, ponieważ definiuje jasny zakres zapytania. Poprawia również wydajność zapytań i znaczenie wyników.
Uwaga
KQL, który jest używany przez usługę Azure Monitor, uwzględnia wielkość liter. Słowa kluczowe języka są zwykle pisane małymi literami. W przypadku używania nazw tabel lub kolumn w zapytaniu należy użyć poprawnego przypadku, jak pokazano w okienku schematu.
Zapytania oparte na tabelach
Usługa Azure Monitor organizuje dane dzienników w postaci tabel, z których każda składa się z wielu kolumn. Wszystkie tabele i kolumny są wyświetlane w okienku schematu w usłudze Log Analytics w witrynie Azure Portal.
Zidentyfikuj tabelę, którą cię interesują, a następnie przyjrzyj się trochę danych:
SecurityEvent
| take 10
Powyższe zapytanie zwraca 10 wyników z SecurityEvent
tabeli, bez określonej kolejności. Ten typowy sposób uzyskiwania dostępu do tabeli pomaga zrozumieć jego strukturę i zawartość. Przyjrzyjmy się, w jaki sposób został utworzony:
- Zapytanie rozpoczyna się od nazwy
SecurityEvent
tabeli , która definiuje zakres zapytania. - Znak potoku (|) oddziela polecenia, więc dane wyjściowe pierwszego polecenia są danymi wejściowymi następnego. Można dodać dowolną liczbę elementów potokowych.
- Po potoku jest
take
operatorem. Możemy uruchomić zapytanie nawet bez dodawania| take 10
elementu . Polecenie nadal będzie prawidłowe, ale może zwrócić maksymalnie 30 000 wyników.
Zapytania wyszukiwania
Zapytania wyszukiwania są mniej ustrukturyzowane. Najlepiej nadają się do znajdowania rekordów, które zawierają określoną wartość w dowolnej kolumnie określonej tabeli.
To zapytanie wyszukuje SecurityEvent
w tabeli rekordy zawierające frazę "Kryptograficzne". Spośród tych rekordów zwracanych jest 10 rekordów i wyświetlanych:
search in (SecurityEvent) "Cryptographic"
| take 10
Jeśli pominiesz in (SecurityEvent)
część i uruchomisz tylko search "Cryptographic"
polecenie , wyszukiwanie przejdzie do wszystkich tabel. Proces ten trwałby dłużej i był mniej wydajny.
Ważne
Zapytania wyszukiwania są zwykle wolniejsze niż zapytania oparte na tabelach, ponieważ muszą przetwarzać więcej danych.
Ogranicz wyniki
Użyj operatora , take
aby wyświetlić niewielką próbkę rekordów, zwracając maksymalnie określoną liczbę rekordów. Na przykład:
SecurityEvent
| take 10
Wybrane wyniki są dowolne i wyświetlane w żadnej określonej kolejności. Jeśli chcesz zwrócić wyniki w określonej kolejności, użyj sort
operatorów i top
.
Sortowanie wyników
W tej sekcji opisano sort
operatory i top
oraz ich desc
argumenty.asc
Chociaż take
jest to przydatne w przypadku uzyskiwania kilku rekordów, nie można wybrać ani posortować wyników w żadnej określonej kolejności. Aby uzyskać uporządkowany widok, użyj polecenia sort
i top
.
Sortuj
Możesz użyć sort
operatora , aby posortować wyniki zapytania według określonej kolumny.
sort
Jednak nie ogranicza liczby rekordów zwracanych przez zapytanie.
Na przykład następujące zapytanie zwraca wszystkie dostępne rekordy dla SecurityEvent
tabeli, czyli maksymalnie 30 000 rekordów i sortuje je według kolumny TimeGenerated.
SecurityEvent
| sort by TimeGenerated
Powyższe zapytanie może zwrócić zbyt wiele wyników. Ponadto zwrócenie wyników może zająć trochę czasu. Zapytanie sortuje całą SecurityEvent
tabelę według kolumny TimeGenerated
. Następnie portal analizy ogranicza wyświetlanie tylko do 30 000 rekordów. Takie podejście nie jest optymalne. Najlepszym sposobem uzyskania najnowszych rekordów jest użycie top
operatora .
Desc i asc
Użyj argumentu desc
, aby sortować rekordy w kolejności malejącej. Malejąco jest domyślną kolejnością sortowania dla sort
i top
, więc zwykle można pominąć desc
argument.
Na przykład dane zwracane przez oba następujące zapytania są sortowane według kolumny TimeGenerated w kolejności malejącej:
-
SecurityEvent | sort by TimeGenerated desc
-
SecurityEvent | sort by TimeGenerated
Aby posortować w kolejności rosnącej, określ wartość asc
.
Góra
top
Użyj operatora , aby posortować całą tabelę po stronie serwera, a następnie zwrócić tylko pierwsze rekordy.
Na przykład następujące zapytanie zwraca najnowsze 10 rekordów:
SecurityEvent
| top 10 by TimeGenerated
Dane wyjściowe wyglądają następująco:
Filtruj wyniki
Filtrowanie to najbardziej typowy sposób ograniczania wyników zapytań do odpowiednich informacji.
Aby dodać filtr do zapytania, użyj where
operatora , po którym następuje co najmniej jeden warunek. Na przykład następujące zapytanie zwraca tylko SecurityEvent
rekordy, w których Level equals _8
:
SecurityEvent
| where Level == 8
Podczas pisania warunków filtrowania można użyć następujących wyrażeń:
Expression | Opis | Przykład |
---|---|---|
== | Sprawdzanie równości (uwzględniana wielkość liter) |
Level == 8 |
=~ | Sprawdzanie równości (bez uwzględniania wielkości liter) |
EventSourceName =~ "microsoft-windows-security-auditing" |
!=, <> | Sprawdzanie nierówności (oba wyrażenia są identyczne) |
Level != 4 |
and , or |
Wymagane między warunkami | Level == 16 or CommandLine != "" |
Filtrowanie według wielu warunków
Aby filtrować według wielu warunków, można użyć jednej z następujących metod:
Użyj polecenia and
, jak pokazano poniżej:
SecurityEvent
| where Level == 8 and EventID == 4672
Potok wielu where
elementów , jeden po drugim, jak pokazano poniżej:
SecurityEvent
| where Level == 8
| where EventID == 4672
Uwaga
Wartości mogą mieć różne typy, więc może być konieczne rzutowanie ich w celu wykonania porównań dla poprawnego typu. Na przykład kolumna SecurityEvent Level
jest typu Ciąg, więc musisz rzutować ją na typ liczbowy, taki jak int
lub long
, przed użyciem operatorów liczbowych, jak pokazano poniżej: SecurityEvent | where toint(Level) >= 10
Określanie zakresu czasu
Zakres czasu można określić przy użyciu selektora czasu lub filtru czasu.
Uwaga
Jeśli uwzględnisz zakres czasu w zapytaniu, selektor czasu automatycznie zmieni się na Ustaw w zapytaniu. Jeśli ręcznie zmienisz selektor czasu na inną wartość, usługa Log Analytics zastosuje mniejsze z dwóch zakresów czasu.
Użyj selektora czasu
Selektor czasu jest wyświetlany obok przycisku Uruchom i wskazuje, że wykonujesz zapytania dotyczące rekordów tylko z ostatnich 24 godzin. Ten domyślny zakres czasu jest stosowany do wszystkich zapytań. Aby pobrać rekordy tylko z ostatniej godziny, wybierz pozycję Ostatnia godzina , a następnie ponownie uruchom zapytanie.
Dodawanie filtru czasu do zapytania
Możesz również zdefiniować własny zakres czasu, dodając filtr czasu do zapytania.
Najlepiej umieścić filtr czasu bezpośrednio po nazwie tabeli:
SecurityEvent
| where TimeGenerated > ago(30m)
| where toint(Level) >= 10
W poprzednim filtrze ago(30m)
czasu oznacza "30 minut temu". To zapytanie zwraca rekordy tylko z ostatnich 30 minut, które są wyrażone na przykład 30 m. Inne jednostki czasu obejmują dni (na przykład 2d) i sekundy (na przykład 10s).
Dołączanie lub wykluczanie kolumn w wynikach zapytania
Użyj project
polecenia , aby wybrać określone kolumny do uwzględnienia w wynikach:
SecurityEvent
| top 10 by TimeGenerated
| project TimeGenerated, Computer, Activity
Powyższy przykład generuje następujące dane wyjściowe:
Możesz również użyć project
polecenia , aby zmienić nazwy kolumn i zdefiniować nowe. W następnym przykładzie użyto project
metody , aby wykonać następujące czynności:
- Wybierz tylko
Computer
oryginalne kolumny i .TimeGenerated
- Wyświetl kolumnę
Activity
jakoEventDetails
. - Utwórz nową kolumnę o nazwie
EventCode
. Funkcjasubstring()
służy do pobierania tylko pierwszych czterech znaków zActivity
pola.
SecurityEvent
| top 10 by TimeGenerated
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)
Definiowanie i używanie pól niestandardowych
Możesz użyć extend
polecenia , aby zachować wszystkie oryginalne kolumny w zestawie wyników i zdefiniować inne. Poniższe zapytanie używa extend
polecenia do dodania kolumny EventCode
. Ta kolumna może nie być wyświetlana na końcu wyników tabeli. Aby go wyświetlić, należy rozwinąć szczegóły rekordu.
SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)
Uwaga
extend
Użyj operatora do obliczeń ad hoc w zapytaniach. Użyj przekształceń czasu pozyskiwania lub reguł podsumowania, aby przekształcać lub agregować dane w czasie pozyskiwania w celu uzyskania bardziej wydajnych zapytań.
Agregowanie i grupowanie wyników
Agregowanie grup wierszy
Służy summarize
do identyfikowania grup rekordów według co najmniej jednej kolumny i stosowania do nich agregacji. Najczęstszym zastosowaniem summarize
funkcji jest count
, która zwraca liczbę wyników w każdej grupie.
Następujące zapytanie przegląda wszystkie Perf
rekordy z ostatniej godziny, grupuje je według ObjectName
i zlicza rekordy w każdej grupie:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName
Grupowanie unikatowych kombinacji wartości w wielu kolumnach
Czasami warto zdefiniować grupy według wielu wymiarów. Każda unikatowa kombinacja tych wartości definiuje oddzielną grupę:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName
Wykonywanie obliczeń matematycznych lub statystycznych
Innym typowym zastosowaniem jest wykonywanie obliczeń matematycznych lub statystycznych dla każdej grupy. Poniższy przykład oblicza średnią CounterValue
dla każdego komputera:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer
Niestety wyniki tego zapytania są bez znaczenia, ponieważ mieszamy ze sobą różne liczniki wydajności. Aby wyniki są bardziej zrozumiałe, oblicz średnią oddzielnie dla każdej kombinacji CounterName
elementów i Computer
:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName
Podsumowywanie według kolumny czasu
Grupowanie wyników może być również oparte na kolumnie czasu lub innej wartości ciągłej. Po prostu podsumowując by TimeGenerated
, można utworzyć grupy dla każdego milisekundy w zakresie czasu, ponieważ te wartości są unikatowe.
Aby utworzyć grupy na podstawie wartości ciągłych, najlepiej podzielić zakres na możliwe do zarządzania jednostki przy użyciu polecenia bin
. Poniższe zapytanie analizuje rekordy Perf
, które mierzą ilość wolnej pamięci (Available MBytes
) na określonym komputerze. Oblicza średnią wartość każdego 1-godzinnego okresu w ciągu ostatnich 7 dni:
Perf
| where TimeGenerated > ago(7d)
| where Computer == "DC01.na.contosohotels.com"
| where CounterName == "Available MBytes"
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)
Aby zwiększyć czytelne dane wyjściowe, możesz wybrać, aby wyświetlić je jako wykres czasu, który pokazuje dostępną pamięć w czasie. Aby to zrobić, przejdź do widoku Wykres, otwórz pasek boczny formatowania wykresupo prawej stronie i wybierz pozycję Linia dla pozycji Typ wykresu:
Często zadawane pytania
Ta sekcja zawiera odpowiedzi na typowe pytania.
Dlaczego widzę zduplikowane rekordy w dziennikach usługi Azure Monitor?
Czasami można zauważyć zduplikowane rekordy w dziennikach usługi Azure Monitor. Duplikowanie jest zwykle z jednego z następujących dwóch warunków:
- Składniki w potoku ponawiają próby w celu zapewnienia niezawodnego dostarczania w miejscu docelowym. Czasami ta funkcja może spowodować duplikaty dla niewielkiej liczby elementów telemetrii.
- Jeśli zduplikowane rekordy pochodzą z maszyny wirtualnej, może być zainstalowany zarówno agent usługi Log Analytics, jak i agent usługi Azure Monitor. Jeśli nadal potrzebujesz zainstalowanego agenta usługi Log Analytics, skonfiguruj obszar roboczy usługi Log Analytics, aby nie zbierać już danych zbieranych przez regułę zbierania danych używaną przez agenta usługi Azure Monitor.
Następne kroki
- Aby dowiedzieć się więcej na temat używania danych ciągu w zapytaniu dziennika, zobacz Praca z ciągami w zapytaniach dziennika usługi Azure Monitor.
- Aby dowiedzieć się więcej na temat agregowania danych w zapytaniu dziennika, zobacz Zaawansowane agregacje w zapytaniach dziennika usługi Azure Monitor.
- Aby dowiedzieć się, jak łączyć dane z wielu tabel, zobacz sprzężenia w zapytaniach dzienników usługi Azure Monitor.
- Uzyskaj dokumentację dotyczącą całego język zapytań Kusto w dokumentacji języka KQL.