使用 Azure 監視器代理程式收集文字或 JSON 檔案中的記錄

許多應用程式會將資訊記錄到文字或 JSON 檔案而非標準的記錄服務,例如 Windows 事件記錄檔或 Syslog。 本文說明如何透過建立資料收集規則 (DCR),使用 Azure 監視器代理程式收集受監視機器上文字和 JSON 檔案中的記錄資料。

注意

JSON 擷取目前處於預覽狀態。

必要條件

為完成此程序,您需要:

  • 您至少擁有參與者權限所在的 Log Analytics 工作區。

  • 視虛擬機器和 Log Analytics 工作區是否位於相同區域而定,為一或兩個資料收集端點

    如需詳細資訊,請參閱如何根據您的部署設定資料收集端點

  • 在工作區中建立資料收集規則物件的權限

  • JSON 文字必須包含在單一數據列中,才能進行適當的擷取。 不支援 JSON 主體(檔案)格式。

  • 在將記錄寫入文字或 JSON 檔案的 Windows 內部部署用戶端上擁有虛擬機器、虛擬機器擴展集、已啟用 Arc 的伺服器內部部署或 Azure 監視代理程式。

    文字和 JSON 檔案需求和最佳做法如下:

    • 將檔案儲存在 Azure 監視器代理程式執行所在的機器本機磁碟機上,以及正在監視的目錄中。
    • 請以行結尾來分隔記錄結尾。
    • 使用 ASCII 或 UTF-8 編碼。 不支援其他格式,例如 UTF-16。
    • 每天建立新的記錄檔,以便輕鬆移除舊檔案。
    • 清除受監視目錄中的所有記錄檔。 追蹤可能會提升代理程式 CPU 和記憶體使用量的記錄檔。 等候至少 2 天,以便有足夠的時間可以處理所有記錄。
    • 請勿以新記錄覆寫現有檔案。 您應該只將新記錄附加至檔案結尾。 覆寫會導致資料遺失。
    • 請勿將檔案重新命名為新的名稱,然後開啟具有相同名稱的新檔案。 這可能會導致資料遺失。
    • 請勿將符合檔案掃描模式的大型記錄檔重新命名或複製到受監視的目錄。 如果有此必要,請勿每分鐘超過 50 MB。
    • 請勿將符合檔案掃描模式的檔案重新命名為同樣符合檔案掃描模式的新名稱。 這會導致擷取重複的資料。

建立自訂資料表

指令碼中建立的資料表有兩個資料行:

  • TimeGenerated (日期時間)[必要]
  • RawData (字串)[如果提供數據表架構,則為選擇性]
  • 'FilePath' (字串) [選擇性]
  • YourOptionalColumn (字串)[選擇性]

從文本檔收集之記錄數據的預設數據表架構為 『TimeGenerated』 和 'RawData'。 將 『FilePath』 新增至任一小組是選擇性的。 如果您知道最終架構或來源是 JSON 記錄檔,您可以在建立資料表之前,先在腳本中新增最終數據行。 您稍後一律 可以使用Log Analytics資料表UI 來新增數據行。

您的數據行名稱和 JSON 屬性必須完全相符,才能自動剖析至數據表。 數據行和 JSON 屬性都區分大小寫。 例如 Rawdata ,不會收集事件數據。 其必須是 RawData。 擷取將會卸除沒有對應數據行的 JSON 屬性。

發出 REST 呼叫最簡單的方式是使用 Azure Cloud PowerShell 命令列 (CLI)。 若要開啟殼層,請移至 Azure 入口網站,按下 [Cloud Shell] 按鈕,然後選取 [PowerShell]。 如果這是您第一次使用 Azure Cloud PowerShell,則必須逐步完成一次性設定精靈。

將此指令碼複製並貼到 PowerShell,在工作區中建立資料表:

$tableParams = @'
{
    "properties": {
        "schema": {
               "name": "{TableName}_CL",
               "columns": [
        {
                                "name": "TimeGenerated",
                                "type": "DateTime"
                        }, 
                       {
                                "name": "RawData",
                                "type": "String"
                       },
                       {
                                "name": "FilePath",
                                "type": "String"
                       },
                      {
                                "name": `"YourOptionalColumn",
                                "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

您應該會收到 200 個回應,以及您剛剛建立的資料表相關詳細資料。

建立文字或 JSON 檔案的數據收集規則

資料收集規則定義:

  • Azure 監視器代理程式要掃描哪些來源記錄檔以找出新事件。
  • Azure 監視器如何在擷取時轉換事件。
  • 接收 Azure 監視器資料傳送的目的地 Log Analytics 工作區和資料表。

您可以定義資料收集規則,將資料從多部機器傳送至多個 Log Analytics 工作區,包括不同區域或租用戶中的工作區。 在與 Log Analytics 工作區相同的區域中建立資料收集規則。

注意

若要跨租用戶傳送資料,您必須先啟用 Azure Lighthouse

若要將 JSON 記錄檔自動剖析成自定義數據表,請遵循 Resource Manager 範本步驟。 文字數據可以使用擷取時間轉換轉換成數據行。

若要在 Azure 入口網站中建立資料收集規則:

  1. 在 [監視器] 功能表上,選取 [資料收集規則]

  2. 選取 [建立],以建立新的資料收集規則與關聯。

    顯示 [數據收集規則] 畫面上 [建立] 按鈕的螢幕快照。

  3. 輸入 [規則名稱],並指定 [訂用帳戶]、[資源群組]、[區域]、[平台型別] 和 [資料收集端點]

    • [區域] 會指定將建立 DCR 的位置。 虛擬機器與其關聯可位於租用戶的任何訂用帳戶或資源群組中。
    • [平台類型] 會指定此規則可套用的目標資源類型。 [自訂] 選項同時允許 Windows 和 Linux 類型。
    • 資料收集端點會指定用來接收 Azure 監視器代理程式傳送收集資料的資料收集端點。 資料收集端點必須位於與 Log Analytics 工作區相同的區域中。 如需詳細資訊,請參閱如何根據您的部署設定資料收集端點

    顯示 [數據收集規則] 畫面 [基本] 索引標籤的螢幕快照。

  4. 在 [資源] 索引標籤上:

    1. 選取 [+ 新增資源],然後將資源關聯至資料收集規則。 資源可以是虛擬機器、虛擬機器擴展集,以及適用於伺服器的 Azure Arc。 Azure 入口網站會在尚未安裝 Azure 監視器代理程式的資源上安裝該代理程式。

      重要

      除了現有的使用者指派身分識別以外 (若有),入口網站也會在目標資源上啟用系統指派的受控識別。 針對現有應用程式,除非您在要求中指定使用者指派的身分識別,否則機器預設會改用系統指派的身分識別。

    2. 選取 [啟用資料收集端點]

    3. 您可以選擇性地為每個與資料收集規則建立關聯的虛擬機選取資料收集端點。 大部分時候,您應該只使用預設值。

      此資料收集端點會將設定檔傳送至虛擬機器,且所在的區域必須與虛擬機器相同。 如需詳細資訊,請參閱如何根據您的部署設定資料收集端點

    顯示 [數據收集規則] 畫面之 [資源] 索引標籤的螢幕快照。

  5. 在 [收集並傳遞] 索引標籤上,選取 [新增資料來源],以新增資料來源並設定目的地。

  6. 從 [資料來源型別] 下拉式清單中,選取 [自訂文字記錄] 或 [JSON 記錄]

  7. 指定下列資訊:

    • 檔案模式 - 識別記錄檔在本機磁碟上的所在位置。 您可以輸入以逗號分隔的多個檔案模式 (在 Linux 上,需要 AMA 1.26 版或更高版本才能從逗號分隔的檔案模式清單中收集資料)。

      有效輸入範例:

      • 20220122-MyLog.txt
      • ProcessA_MyLog.txt
      • ErrorsOnly_MyLog.txt、WarningOnly_MyLog.txt

      注意

      相同型別的多個記錄檔通常位於相同的目錄中。 例如,機器可能會每天建立新的檔案,以防止記錄檔的大小變得太大。 若要收集此案例中的記錄資料,您可以使用檔案萬用字元。 在 Windows 中使用 C:\directoryA\directoryB\*MyLog.txt 格式,在 Linux 中則使用 /var/*.log。 不支援目錄萬用字元。

    • 資料表名稱 - 您在 Log Analytics 工作區中建立的目的地資料表名稱。 如需詳細資訊,請參閱建立自訂資料表

    • 記錄分隔符號 - 未來將用於允許目前支援的行結尾 (/r/n) 以外的分隔符號。

    • 轉換 - 如果您不需要轉換收集到的資料,請新增擷取時間轉換或保留為來源

  8. 在 [目的地] 索引標籤上,為資料來源新增一或多個目的地。 您可以選取相同或不同類型的多個目的地。 例如,您可以選取多個 Log Analytics 工作區,亦稱為多路連接。

    此螢幕快照顯示 Azure 入口網站 中數據收集規則的 [新增數據源] 畫面的目的地索引標籤。

  9. 選取 [檢閱 + 建立],以檢閱資料收集規則的詳細資料,以及與虛擬機器集的關聯。

  10. 選取 [建立] 以建立資料收集規則。

注意

建立數據收集規則之後,最多可能需要10分鐘的時間,資料才會傳送到目的地。

記錄查詢範例

此處使用的資料行名稱僅供參考。 記錄的資料行名稱很可能會有所不同。

  • 依程式碼計算事件數目。

    MyApp_CL
    | summarize count() by code
    

警示規則範例

  • 針對任何錯誤事件建立警示規則。

    MyApp_CL
    | where status == "Error"
    | summarize AggregatedValue = count() by Computer, bin(TimeGenerated, 15m)
    

疑難排解

使用下列步驟,針對從文字和 JSON 檔案收集記錄進行疑難排解。

檢查您是否已將資料擷取到自訂資料表

首先,在 Log Analytics 中執行下列查詢,以檢查是否已將記錄擷取到自訂記錄資料表:

<YourCustomTable>_CL
| where TimeGenerated > ago(48h)
| order by TimeGenerated desc

如果未傳回記錄,請檢查其他區段以了解可能的原因。 此查詢會尋找過去兩天內的項目,但您可以修改以取得另一個時間範圍。 可能需要 5-7 分鐘的時間,新資料才會出現在資料表中。 建立資料收集規則與虛擬機器之間的關聯性之後,Azure 監視器代理程式只會收集寫入文字或 JSON 檔案的資料。

驗證您已建立自訂資料表

您必須先在 Log Analytics 工作區建立自訂記錄資料表,然後才能將資料傳送至該資料表。

驗證代理程式成功傳送活動訊號

在 Log Analytics 中執行下列查詢,檢查活動訊號資料表中是否有任何記錄,以驗證 Azure 監視器代理程式是否正常通訊。

Heartbeat
| where TimeGenerated > ago(24h)
| where Computer has "<computer name>"
| project TimeGenerated, Category, Version
| order by TimeGenerated desc

驗證您已在資料收集規則中指定正確的記錄位置

資料收集規則會有類似下面的區段。 filePatterns 元素會指定要從代理程式電腦收集記錄檔的路徑。 檢查代理程式電腦,以驗證這正確無誤。

"dataSources": [{
            "configuration": {
                "filePatterns": ["C:\\JavaLogs\\*.log"],
                "format": "text",
                "settings": {
                    "text": {
                        "recordStartTimestampFormat": "yyyy-MM-ddTHH:mm:ssK"
                    }
                }
            },
            "id": "myTabularLogDataSource",
            "kind": "logFile",
            "streams": [{
                    "stream": "Custom-TabularData-ABC"
                }
            ],
            "sendToChannels": ["gigl-dce-00000000000000000000000000000000"]
        }
    ]

此檔案模式應該與代理程式機器上的記錄對應。

代理程式電腦上的文字記錄檔螢幕快照。

使用 Azure 監視器代理程式疑難排解

使用 Azure 監視器代理程式疑難排解來尋找常見問題,並與 Microsoft 分享結果。

驗證正在填入記錄

代理程式將只會收集寫入至所收集記錄檔的新內容。 如果您要實驗從文字或 JSON 檔案收集記錄,可以使用下列指令碼來產生範例記錄。

# This script writes a new log entry at the specified interval indefinitely.
# Usage:
# .\GenerateCustomLogs.ps1 [interval to sleep]
#
# Press Ctrl+C to terminate script.
#
# Example:
# .\ GenerateCustomLogs.ps1 5

param (
    [Parameter(Mandatory=$true)][int]$sleepSeconds
)

$logFolder = "c:\\JavaLogs"
if (!(Test-Path -Path $logFolder))
{
    mkdir $logFolder
}

$logFileName = "TestLog-$(Get-Date -format yyyyMMddhhmm).log"
do
{
    $count++
    $randomContent = New-Guid
    $logRecord = "$(Get-Date -format s)Z Record number $count with random content $randomContent"
    $logRecord | Out-File "$logFolder\\$logFileName" -Encoding utf8 -Append
    Start-Sleep $sleepSeconds
}
while ($true)

下一步

深入了解: