本文介绍Logtail的采集原理,包括监听文件、读取文件、处理日志、过滤日志、聚合日志和发送数据等过程。

说明 Logtail采集原理扩展阅读,请参见Logtail技术分享

监听文件

在服务器上安装Logtail及在日志服务控制台上创建Logtail采集配置后,日志服务会实时下发Logtail采集配置到Logtail,Logtail根据Logtail采集配置开始监听文件。Logtail根据Logtail采集配置中的日志路径和最大监控目录深度,逐层扫描符合规则的日志目录和文件。

将Logtail采集配置应用到机器组后,对应服务器上没有发生修改事件的日志文件会被判定为历史日志文件,Logtail监听到历史日志文件,并不会采集。当日志文件产生了修改事件,才会触发采集流程,Logtail开始读取文件。如果您要采集历史日志文件,请参见导入历史日志文件

为保证采集日志的时效性以及稳定性,Logtail会对待采集的目录注册事件监听(Linux下使用Inotify)以及定期轮询。

读取文件

Logtail监听到日志文件,并确认有更新后,开始读取。
  • 首次读取日志文件,会检查文件大小。
    • 如果文件小于1 MB,则从文件内容起始位置开启读取。
    • 如果文件大于1 MB,则从距离文件末尾1 MB处开始读取。
  • 如果Logtail已读取过该日志文件,则从上次读取的Checkpoint处继续读取。
  • 读取日志文件时,每次最多可以读取512 KB,因此每条日志的大小请控制在512 KB以内,否则无法正常读取。
说明 如果您修改了服务器上的时间,请手动重启Logtail,否则会导致日志时间不正确、意外丢弃日志等现象。

处理日志

logtail读取日志后,对日志内容进行分行、解析、设置时间字段。
  • 分行

    如果Logtail采集配置中指定了行首正则表达式,则Logtail根据行首正则表达式对每次读取的日志进行分行,切分成多条日志;如果没有指定行首正则表达式,则将一行日志作为一条日志处理。

  • 解析
    根据Logtail采集配置中配置的采集模式,对每条日志内容进行解析。
    说明 如果您的正则表达式比较复杂,可能会导致CPU占用率过高,请使用合理高效的正则表达式。
    如果解析失败,会根据Logtail采集配置中是否开启丢弃解析失败日志的功能进行处理。
    • 开启丢弃解析失败日志,则直接丢弃该日志,并上报解析失败的报错信息。
    • 关闭丢弃解析失败日志,则上传解析失败的原始日志,其中Key为raw_log、Value为日志内容。
  • 设置日志时间字段
    • 如果未配置时间字段,则日志时间为当前解析日志的时间。
    • 如果配置了时间字段:
      • 日志中记录的时间距离当前时间12小时以内,则从解析的日志字段中提取时间。
      • 日志中记录的时间距离当前时间12小时以上,则丢弃该日志并上传错误信息。

过滤日志

处理日志后,根据Logtail采集配置中的过滤器配置过滤日志。

  • 在Logtail采集配置中未设置过滤器配置,则不过滤日志,执行下一个步骤。
  • Logtail采集配置已设置过滤器配置,则对每条日志中的所有字段进行遍历并验证。

    只有符合过滤器配置的日志被采集。

聚合日志

为降低网络请求次数,在日志处理、过滤完毕后,会在Logtail内部缓存一段时间后进行聚合打包,再发送到日志服务。

缓存数据后,如果满足以下条件之一,则即时打包日志发送到日志服务。
  • 日志聚合时间超过3秒。
  • 日志聚合条数超过4096条。
  • 日志聚合总大小超过512 KB。

发送日志

Logtail将采集到的日志聚合并发送到日志服务。设置启动参数配置文件中的max_bytes_per_sec参数和send_request_concurrency参数可调整日志数据的发送速度和最大并发数,详情请参见配置Logtail启动参数

如果数据发送失败,Logtail自动根据错误信息决定重试或放弃发送。
错误信息 说明 Logtail处理方式
401错误 Logtail没有权限采集数据。 直接丢弃日志包。
404错误 Logtail采集配置中指定的Project或Logstore不存在。 直接丢弃日志包。
403错误 Shard Quota超出限制。 等待3秒后重试。
500错误 服务端异常。 等待3秒后重试。