如何采集多种格式的日志

采集日志时要求日志采用统一的格式,但有时日志中可能会包含多种格式,您可以采用Schema-On-WriteSchema-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配置,每个Logtail配置具有不同的正则配置,从而能够正确地实现字段提取。默认情况下,一个文件只能匹配一个Logtail配置,如果需要为同一份日志应用多个Logtail配置,请参见如何实现文件中的日志被采集多份

  • Schema-On-Read

    • 使用场景:同时分析的日志数量较小(例如千万级),日志格式多变,在查询和分析日志时完成格式化。

    • 说明:使用它们共同的正则表达式来采集。

      1. 例如采用多行日志采集,将时间和日志等级作为行首正则,剩余部分为message。例如提取[2018-10-01T10:30:32,000] [INFO]作为行首正则,message为info something

      2. 如果希望进一步分析message,可以为该字段创建索引,然后利用日志服务的正则提取函数从message字段提取需要的内容。