Udostępnij za pośrednictwem


Zbieranie dzienników z pliku JSON za pomocą agenta usługi Azure Monitor

Niestandardowe dzienniki JSON są jednym ze źródeł danych używanych w regule zbierania danych (DCR). Szczegółowe informacje na temat tworzenia kontrolera domeny znajdują się w temacie Zbieranie danych za pomocą agenta usługi Azure Monitor. Ten artykuł zawiera dodatkowe szczegóły dotyczące typu dzienników tekstowych i JSON.

Wiele aplikacji i usług będzie rejestrować informacje do plików JSON zamiast standardowych usług rejestrowania, takich jak dziennik zdarzeń systemu Windows lub dziennik syslog. Te dane można zbierać za pomocą agenta usługi Azure Monitor i przechowywać w obszarze roboczym usługi Log Analytics przy użyciu danych zebranych z innych źródeł.

Wymagania wstępne

Podstawowa operacja

Na poniższym diagramie przedstawiono podstawową operację zbierania danych dziennika z pliku JSON.

  1. Agent obserwuje wszystkie pliki dziennika, które pasują do określonego wzorca nazwy na dysku lokalnym.
  2. Każdy wpis w dzienniku jest zbierany i wysyłany do usługi Azure Monitor. Strumień przychodzący zdefiniowany przez użytkownika służy do analizowania danych dziennika w kolumnach.
  3. Domyślna transformacja jest używana, jeśli schemat strumienia przychodzącego jest zgodny ze schematem tabeli docelowej.

Zrzut ekranu przedstawiający zapytanie dziennika zwracające wyniki kolekcji plików rozdzielanych przecinkami.

Wymagania dotyczące plików JSON i najlepsze rozwiązania

Plik monitorowany przez agenta usługi Azure Monitor musi spełniać następujące wymagania:

  • Plik musi być przechowywany na dysku lokalnym maszyny z agentem usługi Azure Monitor w monitorowanym katalogu.
  • Każdy rekord musi być rozdzielony końcem wiersza.
  • Plik musi używać kodowania ASCII lub UTF-8. Inne formaty, takie jak UTF-16, nie są obsługiwane.
  • Nowe rekordy powinny być dołączane na końcu pliku i nie zastępować starych rekordów. Zastępowanie spowoduje utratę danych.
  • Tekst JSON musi być zawarty w jednym wierszu. Format treści JSON nie jest obsługiwany. Zobacz przykład poniżej.

Zastosuj się do poniższych zaleceń, aby upewnić się, że nie występują problemy z utratą danych ani wydajnością:

  • Utwórz nowy plik dziennika codziennie, aby można było łatwo wyczyścić stare pliki.
  • Ciągłe czyszczenie plików dziennika w monitorowanym katalogu. Śledzenie wielu plików dziennika może zwiększyć użycie procesora i pamięci agenta. Poczekaj co najmniej 2 dni, aby umożliwić przetwarzanie wszystkich dzienników przez cały czas.
  • Nie zmieniaj nazwy pliku zgodnego ze wzorcem skanowania plików na inną nazwę zgodną ze wzorcem skanowania plików. Spowoduje to pozyskiwanie zduplikowanych danych.
  • Nie zmieniaj nazwy ani nie kopiuj dużych plików dziennika, które są zgodne ze wzorcem skanowania plików do monitorowanego katalogu. Jeśli musisz, nie przekrocz 50 MB na minutę.

Tabela niestandardowa

Zanim będzie można zbierać dane dziennika z pliku JSON, musisz utworzyć tabelę niestandardową w obszarze roboczym usługi Log Analytics, aby odbierać dane. Schemat tabeli musi być zgodny z kolumnami w strumieniu przychodzącym lub należy dodać przekształcenie, aby upewnić się, że schemat wyjściowy jest zgodny z tabelą.

Ostrzeżenie

Nie należy używać istniejącej tabeli niestandardowej używanej przez agenta usługi Log Analytics. Starsi agenci nie będą mogli zapisywać w tabeli po zapisie pierwszego agenta usługi Azure Monitor. Utwórz nową tabelę dla agenta usługi Azure Monitor, aby zapobiec utracie danych agenta usługi Log Analytics.

Na przykład możesz użyć następującego skryptu programu PowerShell, aby utworzyć tabelę niestandardową z wieloma kolumnami.

$tableParams = @'
{
    "properties": {
        "schema": {
               "name": "{TableName}_CL",
               "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "DateTime"
                    }, 
                    {
                        "name": "MyStringColumn",
                        "type": "string"
                    },
                    {
                        "name": "MyIntegerColumn",
                        "type": "int"
                    },
                    {
                        "name": "MyRealColumn",
                        "type": "real"
                    },
                    {
                        "name": "MyBooleanColumn",
                        "type": "bool"
                    },
                    {
                        "name": "FilePath",
                        "type": "string"
                    },
                    {
                        "name": "Computer",
                        "type": "string"
                    }
              ]
        }
    }
}
'@

Invoke-AzRestMethod -Path "/subscriptions/{subscription}/resourcegroups/{resourcegroup}/providers/microsoft.operationalinsights/workspaces/{WorkspaceName}/tables/{TableName}_CL?api-version=2021-12-01-preview" -Method PUT -payload $tableParams

Tworzenie reguły zbierania danych dla pliku JSON

Uwaga

Pozyskiwanie plików niestandardowych JSON oparte na agencie jest obecnie dostępne w wersji zapoznawczej i nie ma jeszcze pełnego interfejsu użytkownika w portalu. Kontroler domeny można utworzyć przy użyciu portalu, ale należy go zmodyfikować, aby zdefiniować kolumny w strumieniu przychodzącym. Ta sekcja zawiera szczegółowe informacje dotyczące tworzenia kontrolera domeny przy użyciu szablonu usługi ARM.

Schemat strumienia przychodzącego

Uwaga

Obsługa wielowierszowa, która używa sygnatury czasowej do rozdzielanych zdarzeń, jest teraz dostępna

Pliki JSON zawierają nazwę właściwości z każdą wartością, a strumień przychodzący w kontrolerze domeny musi zawierać kolumnę zgodną z nazwą każdej właściwości. Musisz zmodyfikować sekcję columns szablonu usługi ARM przy użyciu kolumn z dziennika.

W poniższej tabeli opisano opcjonalne kolumny, które można uwzględnić oprócz kolumn definiujących dane w pliku dziennika.

Kolumna Type Opis
TimeGenerated datetime Godzina wygenerowania rekordu. Ta wartość zostanie automatycznie wypełniona wraz z czasem dodania rekordu do obszaru roboczego usługi Log Analytics, jeśli nie jest uwzględniona w strumieniu przychodzącym.
FilePath string Jeśli dodasz tę kolumnę do strumienia przychodzącego w kontrolerze domeny, zostanie ona wypełniona ścieżką do pliku dziennika. Ta kolumna nie jest tworzona automatycznie i nie można jej dodać przy użyciu portalu. Należy ręcznie zmodyfikować kontroler domeny utworzony przez portal lub utworzyć kontroler domeny przy użyciu innej metody, w której można jawnie zdefiniować strumień przychodzący.
Computer string Jeśli dodasz tę kolumnę do strumienia przychodzącego w kontrolerze domeny, zostanie ona wypełniona nazwą komputera z plikiem dziennika. Ta kolumna nie jest tworzona automatycznie i nie można jej dodać przy użyciu portalu. Należy ręcznie zmodyfikować kontroler domeny utworzony przez portal lub utworzyć kontroler domeny przy użyciu innej metody, w której można jawnie zdefiniować strumień przychodzący.

Przekształcenie

Przekształcenie potencjalnie modyfikuje strumień przychodzący w celu filtrowania rekordów lub modyfikowania schematu tak, aby był zgodny z tabelą docelową. Jeśli schemat strumienia przychodzącego jest taki sam jak tabela docelowa, możesz użyć domyślnej sourcetransformacji . Jeśli nie, zmodyfikuj sekcję transformKql szablonu tee ARM za pomocą zapytania KQL zwracającego wymagany schemat.

Szablon ARM

Użyj następującego szablonu usługi ARM, aby utworzyć kontroler domeny na potrzeby zbierania plików dziennika JSON, wprowadzając zmiany opisane w poprzednich sekcjach. W poniższej tabeli opisano parametry, które wymagają wartości podczas wdrażania szablonu.

Ustawienie opis
Nazwa reguły zbierania danych Unikatowa nazwa kontrolera domeny.
Identyfikator zasobu punktu końcowego zbierania danych Identyfikator zasobu punktu końcowego zbierania danych (DCE).
Lokalizacja Region dla kontrolera domeny. Musi być tą samą lokalizacją co obszar roboczy usługi Log Analytics.
Wzorce plików Identyfikuje lokalizację i nazwę plików dziennika na dysku lokalnym. Użyj symbolu wieloznakowego dla nazw plików, które różnią się, na przykład podczas tworzenia nowego pliku każdego dnia z nową nazwą. Można wprowadzić wiele wzorców plików rozdzielonych przecinkami (AMA w wersji 1.26 lub nowszej wymaganej dla wielu wzorców plików w systemie Linux).

Przykłady:
- C:\Logs\MyLog.json
- C:\Logs\MyLog*.json
- C:\App01\AppLog.json, C:\App02\AppLog.json
- /var/mylog.json
- /var/mylog*.json
Nazwa tabeli Nazwa tabeli docelowej w obszarze roboczym usługi Log Analytics.
Identyfikator zasobu obszaru roboczego Identyfikator zasobu obszaru roboczego usługi Log Analytics z tabelą docelową.
timeFormat Obsługiwane są następujące formaty czasu. Użyj ciągów cudzysłowów w szablonie usługi ARM. Nie dołączaj czasu próbki, który znajduje się w nawiasach.
- "rrrr-MM-ddTHH:mm:ssk" (2024-10-29T18:28:34)
- "RRRR-MM-DD HH:MM:SS" (2024-10-29 18:28:34)
- "M/D/RRRR HH:MM:SS AM/PM" (10/29/2024 06:28:34 PM)
- "Mon DD, RRRR HH:MM:SS" (październik[ober] 29, 2024 18:28:34)
- "yMMddD HH:mm:ss" (241029 18:28:34)
- "ddMMyy HH:mm:ss" (291024 18:28:34)
- "MMM d HH:mm:ss" (29 października 18:28:34)
- "dd/MMM/rrrr:HH:mm:ss zzz" (14/październik/2024:18:28:34 -00)

Ważne

Podczas tworzenia kontrolera domeny przy użyciu szablonu usługi ARM nadal musisz skojarzyć kontroler domeny z agentami, którzy będą go używać. Kontroler domeny można edytować w witrynie Azure Portal i wybrać agentów zgodnie z opisem w temacie Dodawanie zasobów

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "dataCollectionRuleName": {
            "type": "string",
            "metadata": {
                "description": "Unique name for the DCR. "
            }
        },
        "dataCollectionEndpointResourceId": {
            "type": "string",
            "metadata": {
              "description": "Resource ID of the data collection endpoint (DCE)."
            }
        },
        "location": {
            "type": "string",
            "metadata": {
                "description": "Region for the DCR. Must be the same location as the Log Analytics workspace. "
            }
        },
        "filePatterns": {
            "type": "string",
            "metadata": {
                "description": "Path on the local disk for the log file to collect. May include wildcards.Enter multiple file patterns separated by commas (AMA version 1.26 or higher required for multiple file patterns on Linux)."
            }
        },
        "tableName": {
            "type": "string",
            "metadata": {
                "description": "Name of destination table in your Log Analytics workspace. "
            }
        },
        "workspaceResourceId": {
            "type": "string",
            "metadata": {
                "description": "Resource ID of the Log Analytics workspace with the target table."
            }
        },
        "timeFormat": {
            "type": "string"
            "metadata": {
                "discription": "The time format that you would like to use to split multi line imput"
            }
      }
    },
    "variables": {
        "tableOutputStream": "[concat('Custom-', parameters('tableName'))]"
    },
    "resources": [
        {
            "type": "Microsoft.Insights/dataCollectionRules",
            "apiVersion": "2022-06-01",
            "name": "[parameters('dataCollectionRuleName')]",
            "location": "[parameters('location')]",
            "properties": {
                "dataCollectionEndpointId": "[parameters('dataCollectionEndpointResourceId')]",
                "streamDeclarations": {
                    "Custom-Json-stream": {
                        "columns": [
                            {
                                "name": "TimeGenerated",
                                "type": "datetime"
                            },
                            {
                                "name": "FilePath",
                                "type": "string"
                            },
                            {
                                "name": "MyStringColumn",
                                "type": "string"
                            },
                            {
                                "name": "MyIntegerColumn",
                                "type": "int"
                            },
                            {
                                "name": "MyRealColumn",
                                "type": "real"
                            },
                            {
                                "name": "MyBooleanColumn",
                                "type": "boolean"
                            }
                        ]
                    }
                },
                "dataSources": {
                    "logFiles": [
                        {
                            "streams": [
                                "Custom-Json-stream"
                            ],
                            "filePatterns": [
                                "[parameters('filePatterns')]"
                            ],
                            "format": "json",
                            "name": "Custom-Json-stream",
                            "settings": {
                               "text": {
                                   "recordStartTimestampFormat": "[parameters('timeFormat')]"
                               }
                            }
                        }
                    ]
                },
                "destinations": {
                    "logAnalytics": [
                        {
                            "workspaceResourceId": "[parameters('workspaceResourceId')]",
                            "name": "workspace"
                        }
                    ]
                },
                "dataFlows": [
                    {
                        "streams": [
                            "Custom-Json-stream"
                        ],
                        "destinations": [
                            "workspace"
                        ],
                        "transformKql": "source",
                        "outputStream": "[variables('tableOutputStream')]"
                    }
                ]
            }
        }
    ]
}

Rozwiązywanie problemów

Wykonaj poniższe kroki, jeśli nie zbierasz danych z oczekiwanego dziennika JSON.

  • Sprawdź, czy dane są zapisywane w zbieranym pliku dziennika.
  • Sprawdź, czy nazwa i lokalizacja pliku dziennika są zgodne z określonym wzorcem pliku.
  • Sprawdź, czy schemat strumienia przychodzącego w kontrolerze domeny jest zgodny ze schematem w pliku dziennika.
  • Sprawdź, czy schemat tabeli docelowej jest zgodny ze strumieniem przychodzącym lub że masz przekształcenie, które przekonwertuje strumień przychodzący na prawidłowy schemat.
  • Zobacz Weryfikowanie operacji , aby sprawdzić, czy agent działa, a dane są odbierane.

Następne kroki

Dowiedz się więcej na następujące tematy: