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 SecurityEventtabeli , 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 10elementu . 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.

Screenshot that shows the top 10 records sorted in descending order.

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.

Screenshot that shows the time picker and its list of time-range commands.

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:

Screenshot that shows the query 'project' results list.

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 jako EventDetails.
  • Utwórz nową kolumnę o nazwie EventCode. Funkcja substring() służy do pobierania tylko pierwszych czterech znaków z Activity 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 ObjectNamei 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.

Screenshot that shows the values of a query memory over time.

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