完整正则模式要求日志必须采用统一的格式,但有些时候日志中可能会包含多种格式,您可以采用Schema-On-Write和Schema-On-Read两种模式处理。

以 Java 日志为例,作为一个程序日志,它一般既包含正常信息,也会包含异常栈等错误信息:
  • WARNING 类型的多行日志
  • INFO 类型的简单文本日志
  • DEBUG 类型的键值日志
[2018-10-01T10:30:31,000] [WARNING] java.lang.Exception: another exception happened
    at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
    at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
    at TestPrintStackTrace.main(TestPrintStackTrace.java:16)
[2018-10-01T10:30:32,000] [INFO] info something
[2018-10-01T10:30:33,000] [DEBUG] key:value key2:value2
对此,有两种方案可以考虑:
  • Schema-On-Write:为同样的一份日志应用多个采集配置,每个采集配置具有不同的正则配置,从而能够正确地实现字段提取。
    说明 Logtail 不支持对同一个文件同时应用多个采集配置,您需要为该文件所在的目录建立多个软链接,每个配置作用于不同的软链接目录来间接实现多个配置同时采集一个文件。
  • Schema-On-Read:使用它们共同的正则表达式来采集。

    比如说采用多行日志采集,将时间和日志等级作为行首正则,剩余的部分都作为 message。如果希望进一步分析 message,可以为该字段建立索引,然后利用日志服务的正则提取等查询分析功能,从 message 字段提取需要的内容,基于该内容进行分析。

    说明 此方案仅推荐应用于同时分析的日志数量较小的场景下(比如千万级)。