Logtail多行日志采集性能下降的根本原因在于行首正则表达式的匹配方式。Logtail使用boost::regex_match函数进行正则匹配,该函数会对输入的日志buffer进行全量匹配。当用户配置行首正则如cnt.*时,.*部分会匹配整行日志的所有字符。例如一行1072个字符的日志,正则引擎需要遍历所有字符才能完成匹配。测试表明,随着与行首正则无关的日志长度增长,boost::regex_match的耗时呈线性增长。这意味着当日志行非常长时(如包含完整Java异常堆栈信息),正则匹配会消耗大量不必要的CPU资源。实际上,行首正则匹配只需要判断日志开头是否符合特定模式(如cnt),后面的内容完全不需要参与匹配,但regex_match的全量匹配机制导致了这种不必要的性能损耗。




