共用方式為


使用 Azure 監視器從虛擬機收集文本檔

虛擬機上的許多應用程式和服務都會將資訊記錄到文本檔,而不是標準記錄服務,例如 Windows 事件記錄檔或 Syslog。 您可以使用資料收集規則 (DCR) 並搭配自訂文字記錄資料來源,從虛擬機器中收集自訂文字記錄。

如需建立 DCR 的詳細數據,請參閱 使用 Azure 監視器從 VM 用戶端收集數據。 本文提供自定義文字記錄數據源類型的其他詳細數據。

備註

若要直接使用 DCR 定義,或使用 ARM 範本等其他方法進行部署,請參閱 Azure 監視器中的數據收集規則 (DCR) 範例

先決條件

除了使用 Azure 監視器從虛擬機用戶端收集數據中列出的必要條件之外,您需要 Log Analytics 工作區中的自定義數據表才能接收數據。 如需此數據表需求的詳細數據,請參閱 Log Analytics工作區數據表 。 請注意,不支援 Aarch64、alma8 和 rocky8。

設定自訂文字檔數據來源

使用 Azure 監視器中的從虛擬機用戶端收集數據程式建立 DCR。 在 DCR 的 [收集和傳遞] 索引標籤上,從 [數據源類型] 下拉式清單中選取 [自定義文字記錄]。

顯示文字檔集合組態的螢幕快照。

下表說明 自定義文字記錄 設定中可用的選項。

設定 說明
檔案模式 識別本機磁碟機上記錄檔的位置和名稱。 針對檔名使用萬用字元,例如,每天使用新名稱建立新檔案時。 您可以輸入以逗號分隔的多個檔案模式。 您可以在檔案名稱且只能在檔案名稱上方的第一層資料夾名稱中使用萬用字元 (*)。

範例:
- C:\Logs\MyLog.txt
- C:\Logs\MyLog*.txt
-C:\Logs\IIS*\*.logs
- C:\App01\AppLog.txt,C:\App02\AppLog.txt
- /var/mylog.log
- /var/mylog*.log
- /var/logs/*/*
數據表名稱 Log Analytics 工作區中的目的地資料表名稱。 此數據表必須已經存在。
記錄分隔符號 表示記錄項目之間的分隔符。 TimeStamp 是目前唯一允許的值。 這會尋找 中 timeFormat 指定之格式的日期,以識別新記錄的開頭。 如果找不到指定格式的日期,則會使用行尾。 如需詳細資訊,請參閱 時間格式
TimeStamp 格式 記錄檔中使用的時間格式,如下列 時間格式 所述。
轉換 擷取時間轉換篩選記錄或格式化目的地資料表的傳入資料。 使用 source 讓傳入的數據保持不變,並傳送至數據 RawData 行。 請參閱 分隔記錄檔 以了解使用轉換的範例。

新增目的地

自定義文字記錄只能傳送至 Log Analytics 工作區,而該工作區會儲存在您建立的 自定義數據表 中。 新增 Azure 監視器記錄 類型的目的地,然後選取 Log Analytics 工作區。 您只能將單一工作區新增至自訂文字記錄資料來源的 DCR。 如果您需要多個目的地,請建立多個 DCR。 請注意,這會將重複的數據傳送至每個接收者,這會導致額外的成本。

顯示資料收集規則中 Azure 監視器記錄目的地設定的螢幕擷取畫面。

時間格式

下表描述 DCR 設定中 timeFormat 支援的時間格式。 如果記錄專案中包含具有指定格式的時間,則會用來識別新的記錄專案。 如果找不到指定格式的日期,則會使用行尾做為分隔符。 如需如何使用此設定的進一步說明,請參閱 多行記錄檔

時間格式 範例
ISO 8601 1 2024-10-29T18:28:34Z
yyyy-MM-ddTHH:mm:ssk 2024-10-29T18:28:34Z
2024-10-29T18:28:34+01:11
YYYY-MM-DD HH:MM:SS 2024-10-29 18:28:34
M/D/YYYY HH:MM:SS AM/PM 2024/10/29 下午 06:28:34
Mon DD, YYYY HH:MM:SS 2024 年 10 月 29 日 18:28:34
yyMMdd HH:mm:ss 241029 18:28:34
ddMMyy HH:mm:ss 291024 18:28:34
MMM d HH:mm:ss 10 月 29 日 18:28:34
dd/MMM/yyyy:HH:mm:ss zzz 2024年10月14日:18:28:34 -00

1 不支援具有小數/次秒精確度的 ISO 8601 時間戳記。

文字檔需求和最佳做法

Azure 監視器所收集的檔案必須符合下列需求:

  • 檔案必須儲存在受監視的目錄中代理程式計算機的本機磁碟驅動器上。
  • 檔案必須使用 ASCII 或 UTF-8 編碼。 不支援其他格式,例如 UTF-16。
  • 新記錄應該附加至檔案結尾,而不是覆寫舊記錄。 覆寫會導致資料遺失。

以下是 Azure 監視器可收集的典型自定義文字文件範例。 雖然每一行都是以日期開始,但這並非必要,因為如果找不到日期,將使用行的結尾來識別每個條目。

2024-06-21 19:17:34,1423,Error,Sales,Unable to connect to pricing service.
2024-06-21 19:18:23,1420,Information,Sales,Pricing service connection established.
2024-06-21 21:45:13,2011,Warning,Procurement,Module failed and was restarted.
2024-06-21 23:53:31,4100,Information,Data,Nightly backup complete.

請遵循下列建議,以確保您不會遇到資料遺失或效能問題:

  • 不要以超過 10 個包含記錄檔的目錄為目標。 輪詢過多目錄會導致效能不佳。
  • 持續清除受監視目錄中的記錄檔。 追蹤可能會提升代理程式 CPU 和記憶體使用量的記錄檔。 請等候至少兩天,讓所有記錄都有足夠的時間進行處理。
  • 請勿將符合檔案掃描模式的檔案重新命名為另一個也符合檔案掃描模式的名稱。 這會導致擷取重複的資料。
  • 請勿將符合檔案掃描模式的大型記錄檔重新命名或複製到受監視的目錄。 如果有此必要,請勿每分鐘超過 50 MB。

Log Analytics 工作區數據表

日誌檔案中的每個項目在建立後會被收集,並且傳送到 Log Analytics 工作區中指定的數據表。 Log Analytics 工作區中接收數據的自定義數據表必須存在,才能建立 DCR。

下表描述工作區數據表中的必要和選擇性數據行。 數據表可以包含其他欄,但除非您使用分隔記錄檔中所述的轉換來解析數據,這些欄不會被填入。

資料行 類型 是必要的嗎? 說明
TimeGenerated 日期時間 是的 此數據列包含產生記錄的時間,而且在所有數據表中都是必要的。 此值會自動填入記錄新增至 Log Analytics 工作區的時間。 您可以透過一個轉換操作來覆蓋此值,從而將 TimeGenerated 設定為來自記錄項目的值。
RawData 字串 1 單一資料行中的整個記錄項目。 如果您想要將此資料分解成多個資料行,然後再傳送至資料表,您可以使用轉換。
Computer 字串 如果資料表包含此欄位,則會填入從中收集日誌記錄的計算機名稱。
FilePath 字串 如果表格包含此欄位,將會填入從中收集日誌項目的日誌檔案路徑。

1 如果您使用轉換將資料剖析成多個數據行,數據表就不需要包含 RawData 數據行。

使用預設設定收集時,使用記錄查詢擷取上述範例記錄檔中的數據會顯示如下。

顯示記錄查詢傳回預設檔案收集結果的螢幕快照。

建立自訂數據表

如果目的地數據表尚未存在,您必須先建立它,再建立 DCR。 如需建立數據表的不同方法,請參閱建立 自定義數據表

例如,您可以使用下列 PowerShell 腳本來建立自定義數據表,以從自定義文字記錄檔接收數據。 此範例也會新增選擇性數據行。

$tableParams = @'
{
    "properties": {
        "schema": {
               "name": "{TableName}_CL",
               "columns": [
                    {
                        "name": "TimeGenerated",
                        "type": "DateTime"
                    }, 
                    {
                        "name": "Computer",
                        "type": "string"
                    },
                    {
                        "name": "FilePath",
                        "type": "string"
                    },
                    {
                        "name": "RawData",
                        "type": "string"
                    }
              ]
        }
    }
}
'@

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

多行記錄檔

某些記錄檔可能包含跨越多行的條目。 如果每個記錄專案都是以日期開頭,則此日期可作為分隔符來定義每個記錄專案。 在此情況下,額外的行將會聯結在 RawData 欄中。

例如,上一個範例中的文字檔可能會格式化如下:

2024-06-21 19:17:34,1423,Error,Sales,
Unable to connect to pricing service.
2024-06-21 19:18:23,1420,Information,Sales,
Pricing service connection established.
2024-06-21 21:45:13,2011,Warning,Procurement,
Module failed and was restarted.
2024-06-21 23:53:31,4100,Information,Data,
Nightly backup complete.

如果在 DCR 中使用時間戳格式 YYYY-MM-DD HH:MM:SS ,則會以與上一個範例相同的方式收集數據。 額外的行會包含在 RawData 資料行中。 如果使用另一個不符合記錄專案中日期的時間戳格式,則每個項目都會收集為兩筆個別的記錄。

分隔的記錄檔

許多文字記錄檔都有以逗號等字元分隔的資料行。 您可以將數據剖析為不同的欄位,而不是將整個項目傳送至 RawData 欄位,以便每個欄位都可以在目的地數據表中填入。 使用轉換並搭配分割函式來執行此剖析。

上面顯示的範例文字檔是以逗號分隔,而且字段可以描述為:TimeCodeSeverityModuleMessage。 若要將此數據剖析成不同的數據行,請將每個數據行新增至目的地數據表,並將下列轉換新增至 DCR。

這很重要

在將此轉換新增至 DCR 之前,您必須將這些資料行新增至目的地資料表。 您可以修改上述 PowerShell 腳本,以在建立數據表時包含其他數據行。 或使用 Azure 入口網站,如 新增或刪除自訂數據行 中所述,將數據行新增至現有的數據表。

轉換查詢的顯著詳細資料包括下列各項:

  • 查詢會輸出每個屬性,這些屬性與目標表格中的欄位名稱都相符合。
  • 這個範例會在記錄檔中重新命名Time屬性,讓此值用於TimeGenerated。 如果未提供,則會以擷取時間填入 TimeGenerated
  • 由於 split 會傳回動態資料,因此您必須使用 tostringtoint 等函數,將資料轉換成正確的純量類型。
source | project d = split(RawData,",") | project TimeGenerated=todatetime(d[0]), Code=toint(d[1]), Severity=tostring(d[2]), Module=tostring(d[3]), Message=tostring(d[4])

顯示逗號分隔檔案集合組態的螢幕擷取畫面。

使用記錄查詢擷取此資料會傳回下列結果。

顯示記錄查詢傳回逗號分隔檔案集合結果的螢幕擷取畫面。

故障排除

如果您從文字記錄沒有收集到預期的資料,請執行下列步驟。

  • 確認資料正在寫入所收集的記錄檔。
  • 確認記錄檔的名稱和位置符合您指定的檔案模式。
  • 確認目標資料表的結構描述與傳入資料流相符,或您有能將傳入資料流轉換成正確結構描述的轉換。
  • 請參閱 確認作業 以確認代理程式是否運作,以及是否正在接收資料。

後續步驟