Wprowadzenie do zapytań dotyczących dzienników w usłudze Azure Monitor
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.
Jeśli wiesz już, jak wykonywać zapytania w język zapytań Kusto (KQL), ale musisz szybko tworzyć przydatne zapytania na podstawie typów zasobów, zobacz zapisane przykładowe okienko zapytań w temacie Korzystanie z zapytań w usłudze Azure Monitor Log Analytics.
Z tego samouczka dowiesz się, jak pisać zapytania dzienników w usłudze Azure Monitor. Ten artykuł zawiera omówienie następujących czynności:
- Omówienie struktury zapytań.
- Sortuj wyniki zapytania.
- Filtruj wyniki zapytania.
- Określ zakres czasu.
- Wybierz pola do uwzględnienia w wynikach.
- Definiowanie i używanie pól niestandardowych.
- Agregowanie i grupowanie wyników.
Aby zapoznać się z samouczkiem dotyczącym korzystania z usługi Log Analytics w witrynie Azure Portal, zobacz Rozpoczynanie pracy z usługą Azure Monitor Log Analytics.
Aby uzyskać więcej informacji na temat zapytań dzienników w usłudze Azure Monitor, zobacz Omówienie zapytań dzienników w usłudze Azure Monitor.
Oto wersja wideo tego samouczka:
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.
Pisanie nowego 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 portalu analizy. Zidentyfikuj tabelę, którą cię interesuje, 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.
Take
Użyj operatora , take
aby wyświetlić niewielką próbkę rekordów, zwracając maksymalnie określoną liczbę rekordów. 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
.
Zapytania wyszukiwania
Zapytania wyszukiwania są mniej ustrukturyzowane. Lepiej nadają się do znajdowania rekordów, które zawierają określoną wartość w dowolnej z ich kolumn:
search in (SecurityEvent) "Cryptographic"
| take 10
To zapytanie wyszukuje SecurityEvent
w tabeli rekordy zawierające frazę "Kryptograficzne". Spośród tych rekordów zwracanych i wyświetlanych jest 10 rekordów. 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.
Sortuj i od góry
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
.
Desc i asc
Desc
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
Asc
Aby posortować w kolejności rosnącej, określ wartość asc
.
Sortuj
Możesz użyć sort
operatora . sort
sortuje 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 .
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ą podobnie do tego przykładu.
Operator where: Filter on a condition
Filtry, zgodnie z ich nazwą, filtrują dane według określonego warunku. 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 != "" |
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.
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. Dodanie filtru czasu zastępuje zakres czasu wybrany w selektorze czasu.
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).
Używanie projektu i rozszerzanie do wybierania i obliczania kolumn
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)
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)
Używanie funkcji summarize do agregowania 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
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
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 == "ContosoAzADDS2"
| 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.
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.