閱讀英文

共用方式為

使用 Azure Monitor 代理从文本文件收集日志

自定义文本日志数据收集规则 (DCR) 中使用的数据源之一。 有关创建 DCR 的详细信息,请参阅使用 Azure Monitor 代理收集数据。 本文提供有关文本日志类型的其他详细信息。

许多应用程序和服务将信息记录到文本文件,而不是标准日志记录服务(例如 Windows 事件日志或 Syslog)。 可以使用 Azure Monitor 代理收集此数据,并将其存储在 Log Analytics 工作区中,其中包含从其他源收集的数据。

先决条件

基本操作

下图显示了从文本文件收集日志数据的基本操作。

  1. 该代理监视与本地磁盘上的指定名称模式匹配的任何日志文件。
  2. 将收集日志中的每个条目并将其发送到 Azure Monitor。 传入流包括单个列中的整个日志条目。
  3. 如果使用默认转换,则整个日志条目将发送到目标表中的单个列。
  4. 如果使用自定义转换,则可以将日志条目解析为目标表中的多个列。

显示 Azure Monitor 代理对文本日志的收集的关系图,其中显示了简单的收集和对逗号分隔文件的转换。

文本文件要求和最佳做法

Azure Monitor 代理所监视的文件必须满足以下要求:

  • 文件必须存储在运行 Azure Monitor 代理的计算机本地驱动器上所监视的目录中。
  • 每条记录必须用行尾符来分隔。
  • 文件必须使用 ASCII 或 UTF-8 编码。 不支持其他格式,如 UTF-16。
  • 新记录应附加到文件末尾,而不是覆盖旧记录。 覆盖将导致数据丢失。

遵循以下建议,确保不会遇到数据丢失或性能问题:

  • 每天创建一个新的日志文件,以便可以轻松清理旧文件。
  • 持续清理受监视目录中的日志文件。 跟踪过多日志文件可能会提高代理 CPU 和内存使用率。 请至少等待 2 天,以便有足够的时间处理所有日志。
  • 请勿将与文件扫描模式匹配的文件重命名为同样与文件扫描模式匹配的其他名称。 这将导致引入重复数据。
  • 请勿重命名与文件扫描模式匹配的大型日志文件或将其复制到受监视的目录。 如果必须这样做,则每分钟不得超过 50MB。

传入流

数据的传入流包括下表中的列。

类型​​ 说明
TimeGenerated 日期/时间 生成记录的时间。 该值将根据记录添加到 Log Analytics 工作区的时间自动填充。 可以替代此值,方法是使用转换将 TimeGenerated 设置为其他值。
RawData 字符串 整个日志条目在单个列中。 如果要在发送到表之前将此数据细分为多个列,则可以使用转换。
FilePath 字符串 如果将此列添加到 DCR 中的传入流,则会使用日志文件的路径进行填充。 此列不是自动创建的,无法使用门户进行添加。 必须手动修改门户创建的 DCR,或使用另一种可以显式定义传入流的方法来创建 DCR。
Computer 字符串 如果将此列添加到 DCR 中的传入流,系统会将包含日志文件的计算机名称填入此列。 此列不是自动创建的,无法使用门户进行添加。 必须手动修改门户创建的 DCR,或使用另一种可以显式定义传入流的方法来创建 DCR。

自定义表

在从文本文件收集日志数据之前,必须在 Log Analytics 工作区中创建一个自定义表来接收数据。 表架构必须与要收集的数据匹配,或者必须添加转换,以确保输出架构与表匹配。 可以使用以下 PowerShell 脚本创建包含 RawDataFilePathComputer自定义表。

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

为文本文件创建数据收集规则

按照使用 Azure Monitor 代理收集数据中的说明,创建数据收集规则。 在收集和传递步骤中,从“数据源类型”下拉列表中选择“自定义文本日志”。

设置 说明
文件模式 标识本地磁盘上日志文件的位置和名称。 对不同的文件名使用通配符,例如每天用新名称创建新文件时。 可以输入以逗号分隔的多个文件模式。

示例:
- C:\Logs\MyLog.txt
- C:\Logs\MyLog*.txt
- C:\App01\AppLog.txt, C:\App02\AppLog.txt
- /var/mylog.log
- /var/mylog*.log
表名称 Log Analytics 工作区中目标表的名称。
记录分隔符 目前未使用,但会保留以供将来使用,允许使用除当前支持的行尾符 (/r/n) 以外的分隔符。
转换 引入时转换,用于筛选记录或设置目标表的传入数据的格式。 使用 source 使传入的数据保持不变。

带分隔符的日志文件

许多文本日志文件都包含由逗号等字符分隔的条目。 若要将此数据解析为单独的列,请使用具有 split 函数的转换。

例如,请考虑使用包含以下逗号分隔数据的文本文件。 这些字段可以描述为:TimeCodeSeverityModuleMessage

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.

以下转换将数据解析为单独的列。 由于 split 返回动态数据,因此必须使用 tostringtoint 等函数将数据转换为正确的标量类型。 还需要为与目标表中的列名匹配的每个条目提供一个名称。 请注意,此示例提供了 TimeGenerated 值。 如果未提供,则会使用引入时间。

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])

屏幕截图显示逗号分隔的文件收集配置。

使用日志查询检索此数据将返回以下结果。

屏幕截图显示日志查询返回逗号分隔的文件收集结果。

故障排除

如果没有从预期的文本日志中收集到数据,请执行以下步骤。

  • 验证数据是否正在写入到所收集的日志文件。
  • 验证日志文件的名称和位置是否与指定的文件模式匹配。
  • 验证目标表的架构是否与传入流匹配,或者你是否具有将传入流转换为正确架构的转换。
  • 请参阅验证操作,以验证代理是否正在运行,以及是否正在接收数据。

后续步骤

了解有关以下方面的详细信息: