You need to enable JavaScript to run this app.
导航
多行全文日志的聚合规则
最近更新时间:2024.09.13 17:23:00首次发布时间:2024.09.13 17:23:00

本文介绍通过 LogCollector 多行全文模式采集多行日志时的聚合规则和相关示例。

聚合规则

LogCollector 多行全文模式的聚合规则如下:

  • 读取到的某行日志完全匹配首行正则表达式时,如果:
    • 当前存在一个多行日志块,那么 LogCollector 将发送该多行日志块,然后再创建一个新的多行日志块,并将当前读取到的这行日志作为新日志块的开头。
    • 当前不存在多行日志块,那么 LogCollector 将创建一个新的多行日志块,并且将当前读取到的这行日志作为新日志块的开头。
  • 读取到的某行日志不完全匹配首行正则表达式时,如果:
    • 当前存在一个多行日志块,那么 LogCollector 将当前读取到的这行日志追加到该多行日志块的末尾。
    • 当前不存在多行日志块,那么 LogCollector 将直接发送这行日志。
  • EOF (文件结束符)处理:
    如果读取到文件结束符(EOF),并且连续 5 秒读取到 EOF ,那么 LogCollector 将发送已存在的多行日志块。

典型场景示例

  • 首行正则表达式

    xxx.*
    
  • 用户侧原始日志

    xxx1
    yyy11
    yyy12
    xxx2
    yyy21
    yyy22
    
  • 最终发送的日志

    xxx1\nyyy11\nyyy12
    xxx2\nyyy21\nyyy22
    

日志聚合步骤如下:

  1. 读取第 1 行日志 xxx1,因其完全匹配首行正则表达式 xxx.*,所以 LogCollector 将新建一个多行日志块,并将 xxx1 作为该日志块的开头。
  2. 读取第 2 行日志 yyy11,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志 yyy11 追加至当前多行日志块的末尾。
  3. 读取第 3 行日志 yyy12,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志 yyy12 追加至当前多行日志块的末尾。
  4. 读取第 4 行日志 xxx2,因其完全匹配首行正则表达式 xxx.*,所以 LogCollector 将发送当前的多行日志块 xxx1\nyyy11\nyyy12,然后创建一个新的多行日志块,并将 xxx2 作为新多行日志块的开头。
  5. 读取第 5 行日志 yyy21,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志 yyy21 追加至当前多行日志块的末尾。
  6. 读取第 6 行日志 yyy22,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志 yyy22 追加至当前多行日志块的末尾。
  7. 持续 5 秒读取到 EOF,LogCollector 发送当前多行日志块 xxx2\nyyy21\nyyy22

特殊场景示例

单行日志和多行日志在一个文件中

  • 首行正则表达式

    xxx.*
    
  • 用户侧原始日志

    yyy11
    yyy12
    yyy13
    xxx2
    yyy21
    yyy22
    
  • 最终发送的日志

    yyy11
    yyy12
    yyy13
    xxx2\nyyy21\nyyy22
    

多行日志聚合规则如下:

  1. 读取到第 1 行日志 yyy11,因其不完全匹配首行正则表达式 xxx.*,并且当前不存在多行日志块,所以 LogCollector 将直接发送日志 yyy11
  2. 读取到第 2 行日志 yyy12,因其不完全匹配首行正则表达式 xxx.*,并且当前不存在多行日志块,所以 LogCollector 将直接发送日志 yyy12
  3. 读取到第 3 行日志 yyy13,因其不完全匹配首行正则表达式 xxx.*,并且当前不存在多行日志块,所以 LogCollector 将直接发送日志 yyy13
  4. 读取到第 4 行日志 xxx2,因其完全匹配首行正则表达式 xxx.*,所以 LogCollector 将新建一个多行日志块,并将日志 xxx2 作为新的多行日志块的开头。
  5. 读取到第 5 行日志 yyy21,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志 yyy21 追加至当前多行日志块的末尾。
  6. 读取到第 6 行日志 yyy22,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志 yyy22 追加至当前多行日志块的末尾。
  7. 持续 5 秒读取到 EOF,LogCollector 发送当前多行日志块 xxx2\nyyy21\nyyy22

多行日志的大小超过 512 KB

  • 首行正则表达式

    xxx.*
    
  • 用户侧原始日志

    xxx1
    yyy11
    ……    // 此处省略 N 行日志。
    yyy12 // 其中,1 是多行日志的第 512KB 个字节,即采集时 1 后面的字符将被截断。
    yyy13
    yyy14
    
  • 最终发送的日志

    xxx1\nyyy11\n……\nyyy1
    2
    yyy13
    yyy14
    

多行日志聚合规则如下:

  1. 读取到第 1 行日志 xxx1,因其完全匹配首行正则表达式 xxx.*,所以 LogCollector 将新建一个多行日志块,并将 xxx1 作为新多行日志块的开头。
  2. 读取到第 2 行日志 yyy11,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志 yyy11 追加至当前多行日志块的末尾。
  3. 中间省略的 N 行日志的采集操作同上。
  4. 读取到日志 yyy12,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志 yyy12 追加至当前多行日志块的末尾。此时多行日志块的大小超过 512KB,所以从 yyy121 处开始截断,先发送日志块 xxx1\nyyy11\n……\nyyy1,再发送日志块 2
  5. 读取到日志 yyy13,因其不完全匹配首行正则表达式 xxx.*,并且当前不存在多行日志块,所以 LogCollector 将直接发送日志 yyy13
  6. 读取到日志 yyy14,因其不完全匹配首行正则表达式 xxx.*,并且当前不存在多行日志块,所以 LogCollector 将直接发送日志 yyy14

多行日志的落盘间隔超过 5 秒

  • 首行正则表达式

    xxx.*
    
  • 用户侧原始日志

    xxx1
    yyy11
    // 5s之后
    yyy12
    yyy13
    
  • 最终发送的日志

    xxx1\nyyy11
    yyy12
    yyy13
    

多行日志聚合规则如下:

  1. 读取到日志 xxx1,因其完全匹配首行正则表达式 xxx.*,所以 LogCollector 将新建一个多行日志块,并将 xxx1 作为新多行日志块的开头。
  2. 读取到日志 yyy11,因其不完全匹配首行正则表达式 xxx.*,所以 LogCollector 将日志yyy11 追加至当前多行日志块的末尾。
  3. 持续 5 秒仍然读到 EOF,所以 LogCollector 将发送当前多行日志块 xxx1\nyyy11
  4. 读取到日志 yyy12,因其不完全匹配首行正则表达式 xxx.*,并且当前不存在多行日志块,所以 LogCollector 将直接发送日志 yyy12
  5. 读取到日志 yyy12,因其不完全匹配首行正则表达式 xxx.*,并且当前不存在多行日志块,所以 LogCollector 将直接发送日志 yyy13