在统一的单线程环境下测试,发现单行日志采集速度为 425MB/s,而多行日志采集速度只有 98MB/s,近乎 80% 的性能下降远远超出了对多行处理开销的初步估计,显然存在重大性能瓶颈。
根因在于多行日志合并的正则匹配方法。Logtail 的多行日志合并功能基于行首正则把分散的多行数据聚合为完整事件:用户配置行首正则表达式,Logtail 对每行日志开头应用此正则,若某行不匹配就继续等待直至找到匹配的行首。
关键问题是 Logtail 使用 boost::regex_match 函数进行全量匹配。以一条日志为例,正则表达式会对第一行的全部 253 个字符进行匹配,而实际上只有行首部分是关键的。通过编写测试代码实验观察到一个关键现象:随着与行首正则无关的日志长度增加(即 .* 匹配的那部分),boost::regex_match 的执行时间也呈线性增长。
由此得出结论:全量匹配低效(regex_match 对整行匹配,即使只有行首关键)、资源浪费(匹配时间与日志行长度呈线性关系,大部分时间花在与实际分割逻辑无关的内容上),这在处理大量长行日志时会导致严重性能下降。




