使用Logtail SPL解析日志

iLogtail 支持三种处理模式:原生插件模式(C++实现,性能最强)、拓展插件模式(Go实现,生态丰富且灵活)和SPL模式(在iLogtail 2.0中引入,结合了性能和灵活性)。通过编写SPL语句,您可以充分利用其计算能力来处理数据。本文将介绍如何使用SPL语句实现与其他两种处理模式相同的功能。

前提条件

使用限制

  • SPL采集日志仅支持Logtail 2.0及以上版本。

  • 文本日志采集支持通过控制台配置,其他数据接入暂不支持控制台配置,请通过API或CRD配置。

使用示例

SPL使用示例请参见使用SPL采集文本日志

操作步骤

在修改Logtail配置时添加SPL

  1. 登录日志服务控制台

  2. 在Project列表区域,单击目标Project。

    image

  3. 日志存储 > 日志库页签中,单击目标日志库前面的>,依次选择数据接入 > Logtail配置

    image

  4. Logtail配置列表中,单击目标Logtail配置后操作列的管理Logtail配置

  5. 单击页面上方的编辑,在页面下方的处理配置区域,处理配置处理模式选择SPL,然后单击保存

    全局配置

    配置项

    说明

    配置名称

    Logtail配置名称,在其所属Project内必须唯一。创建Logtail配置成功后,无法修改其名称。

    日志主题类型

    选择日志主题(Topic)的生成方式。更多信息,请参见日志主题

    • 机器组Topic:设置为机器组的Topic属性,用于明确区分不同机器组产生的日志。

    • 文件路径提取:设置为文件路径正则,则需要设置自定义正则,用正则表达式从路径里提取一部分内容作为Topic。用于区分不同源产生的日志。

    • 自定义:自定义日志主题。

    高级参数

    其它可选的与配置全局相关的高级功能参数,请参见创建Logtail流水线配置

    输入配置

    配置项

    说明

    文件路径

    根据日志在主机(例如ECS)上的位置,设置日志目录和文件名称。

    • 如果目标主机是Linux系统,则日志路径必须以正斜线(/)开头,例如/apsara/nuwa/**/app.Log

    • 如果目标主机是Windows系统,则日志路径必须以盘符开头,例如C:\Program Files\Intel\**\*.Log

    目录名和文件名均支持完整模式和通配符模式,文件名规则请参见Wildcard matching。其中,日志路径通配符只支持星号(*)和半角问号(?)。

    日志文件查找模式为多层目录匹配,即符合条件的指定目录(包含所有层级的目录)下所有符合条件的文件都会被查找到。例如:

    • /apsara/nuwa/**/*.log表示/apsara/nuwa目录(包含该目录的递归子目录)中后缀名为.log的文件。

    • /var/logs/app_*/**/*.log表示/var/logs目录下所有符合app_*格式的目录(包含该目录的递归子目录)中后缀名为.log的文件。

    • /var/log/nginx/**/access*表示/var/log/nginx目录(包含该目录的递归子目录)中以access开头的文件。

    最大目录监控深度

    设置日志目录被监控的最大深度,即文件路径中通配符**匹配的最大目录深度。0代表只监控本层目录。

    文件编码

    选择日志文件的编码格式。

    首次采集大小

    配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。首次采集大小设定值为1024 KB。

    • 首次采集时,如果文件小于1024 KB,则从文件内容起始位置开始采集。

    • 首次采集时,如果文件大于1024 KB,则从距离文件末尾1024 KB的位置开始采集。

    您可以通过此处修改首次采集大小,取值范围为0~10485760,单位为KB。

    采集黑名单

    打开采集黑名单开关后,可进行黑名单配置,即可在采集时忽略指定的目录或文件。支持完整匹配和通配符匹配目录和文件名。其中,通配符只支持星号(*)和半角问号(?)。

    重要
    • 如果您在配置文件路径时使用了通配符,但又需要过滤掉其中部分路径,则需在采集黑名单中填写对应的完整路径来保证黑名单配置生效。

      例如您配置文件路径/home/admin/app*/log/*.log,但要过滤/home/admin/app1*目录下的所有子目录,则需选择目录黑名单,配置目录为/home/admin/app1*/**。如果配置为/home/admin/app1*,黑名单不会生效。

    • 匹配黑名单过程存在计算开销,建议黑名单条目数控制在10条内。

    • 目录路径不能以正斜线(/)结尾,例如将设置路径为/home/admin/dir1/,目录黑名单不会生效。

    支持按照文件路径黑名单、文件黑名单、目录黑名单设置,详细说明如下:

    文件路径黑名单

    • 选择文件路径黑名单,配置路径为/home/admin/private*.log,则表示在采集时忽略/home/admin/目录下所有以private开头,以.log结尾的文件。

    • 选择文件路径黑名单,配置路径为/home/admin/private*/*_inner.log,则表示在采集时忽略/home/admin/目录下以private开头的目录内,以_inner.log结尾的文件。例如/home/admin/private/app_inner.log文件被忽略,/home/admin/private/app.log文件被采集。

    文件黑名单

    选择文件黑名单,配置文件名为app_inner.log,则表示采集时忽略所有名为app_inner.log的文件。

    目录黑名单

    • 选择目录黑名单,配置目录为/home/admin/dir1,则表示在采集时忽略/home/admin/dir1目录下的所有文件。

    • 选择目录黑名单,配置目录为/home/admin/dir*,则表示在采集时忽略/home/admin/目录下所有以dir开头的子目录下的文件。

    • 选择目录黑名单,配置目录为/home/admin/*/dir,则表示在采集时忽略/home/admin/目录下二级目录名为dir的子目录下的所有文件。例如/home/admin/a/dir目录下的文件被忽略,/home/admin/a/b/dir目录下的文件被采集。

    允许文件多次采集

    默认情况下,一个日志文件只能匹配一个Logtail配置。如果文件中的日志需要被采集多份,需要打开允许文件多次采集开关。

    高级参数

    其它可选的与文件输入插件相关的高级功能参数,请参见创建Logtail流水线配置

    处理配置

    配置项

    说明

    日志样例

    待采集日志的样例,请务必使用实际场景的日志。日志样例可协助您配置日志处理相关参数,降低配置难度。支持添加多条样例,总长度不超过1500个字符。

    [2023-10-01T10:30:01,000] [INFO] java.lang.Exception: exception happened
        at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
        at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
        at TestPrintStackTrace.main(TestPrintStackTrace.java:16)

    多行模式

    • 多行日志的类型:多行日志是指每条日志分布在连续的多行中,需要从日志内容中区分出每一条日志。

      • 自定义:通过行首正则表达式区分每一条日志。

      • 多行JSON:每个JSON对象被展开为多行,例如:

        {
          "name": "John Doe",
          "age": 30,
          "address": {
            "city": "New York",
            "country": "USA"
          }
        }
    • 切分失败处理方式:

      Exception in thread "main" java.lang.NullPointerException
          at com.example.MyClass.methodA(MyClass.java:12)
          at com.example.MyClass.methodB(MyClass.java:34)
          at com.example.MyClass.main(MyClass.java:½0)

      对于以上日志内容,如果日志服务切分失败:

      • 丢弃:直接丢弃这段日志。

      • 保留单行:将每行日志文本单独保留为一条日志,保留为一共四条日志。

    处理模式

    处理模式选择SPL

    SPL语句

    SPL语句具体请参考 SPL语法。解析日志前,日志默认存在content字段中。

    超时时间

    SPL语句执行一次的最大时间。

在创建Logtail配置时添加SPL

  1. 登录日志服务控制台

  2. 快速数据接入对话框的自建开源/商业软件页签下,选择包含文本日志后缀的入口。

    说明

    目前SPL采集支持文本日志采集,其他数据接入(Kubernetes - 标准输出、Docker标准输出等)暂不支持控制台配置。

    image

  3. 选择日志空间页面,按照选择目标Project和Logstore,单击下一步

    image

  4. 机器组配置页面,配置机器组。

    1. 根据实际需求,选择使用场景和安装环境。

      重要

      无论是否已有机器组,都必须根据实际需求正确选择使用场景和安装环境,这将影响后续的页面配置。

    2. 确认目标机器组已在应用机器组区域,单击下一步

      已有机器组

      源机器组列表选择目标机器组。

      image

      没有可用机器组

      单击创建机器组,在创建机器组面板设置相关参数。机器组标识分为IP地址用户自定义标识,更多信息请参见创建用户自定义标识机器组(推荐)创建IP地址机器组

      重要

      创建机器组后立刻应用,可能因为连接未生效,导致心跳为FAIL,您可单击重试。如果还未解决,请参见Logtail机器组无心跳进行排查。

  5. 创建Logtail配置,单击下一步,创建Logtail配置。全局配置输入配置和处理插件相同,处理配置处理模式选择SPL

    • 全局配置

      配置项

      说明

      配置名称

      Logtail配置名称,在其所属Project内必须唯一。创建Logtail配置成功后,无法修改其名称。

      日志主题类型

      选择日志主题(Topic)的生成方式。更多信息,请参见日志主题

      • 机器组Topic:设置为机器组的Topic属性,用于明确区分不同机器组产生的日志。

      • 文件路径提取:设置为文件路径正则,则需要设置自定义正则,用正则表达式从路径里提取一部分内容作为Topic。用于区分不同源产生的日志。

      • 自定义:自定义日志主题。

      高级参数

      其它可选的与配置全局相关的高级功能参数,请参见创建Logtail流水线配置

    • 输入配置

      配置项

      说明

      文件路径

      根据日志在主机(例如ECS)上的位置,设置日志目录和文件名称。

      • 如果目标主机是Linux系统,则日志路径必须以正斜线(/)开头,例如/apsara/nuwa/**/app.Log

      • 如果目标主机是Windows系统,则日志路径必须以盘符开头,例如C:\Program Files\Intel\**\*.Log

      目录名和文件名均支持完整模式和通配符模式,文件名规则请参见Wildcard matching。其中,日志路径通配符只支持星号(*)和半角问号(?)。

      日志文件查找模式为多层目录匹配,即符合条件的指定目录(包含所有层级的目录)下所有符合条件的文件都会被查找到。例如:

      • /apsara/nuwa/**/*.log表示/apsara/nuwa目录(包含该目录的递归子目录)中后缀名为.log的文件。

      • /var/logs/app_*/**/*.log表示/var/logs目录下所有符合app_*格式的目录(包含该目录的递归子目录)中后缀名为.log的文件。

      • /var/log/nginx/**/access*表示/var/log/nginx目录(包含该目录的递归子目录)中以access开头的文件。

      最大目录监控深度

      设置日志目录被监控的最大深度,即文件路径中通配符**匹配的最大目录深度。0代表只监控本层目录。

      文件编码

      选择日志文件的编码格式。

      首次采集大小

      配置首次生效时,匹配文件的起始采集位置距离文件结尾的大小。首次采集大小设定值为1024 KB。

      • 首次采集时,如果文件小于1024 KB,则从文件内容起始位置开始采集。

      • 首次采集时,如果文件大于1024 KB,则从距离文件末尾1024 KB的位置开始采集。

      您可以通过此处修改首次采集大小,取值范围为0~10485760,单位为KB。

      采集黑名单

      打开采集黑名单开关后,可进行黑名单配置,即可在采集时忽略指定的目录或文件。支持完整匹配和通配符匹配目录和文件名。其中,通配符只支持星号(*)和半角问号(?)。

      重要
      • 如果您在配置文件路径时使用了通配符,但又需要过滤掉其中部分路径,则需在采集黑名单中填写对应的完整路径来保证黑名单配置生效。

        例如您配置文件路径/home/admin/app*/log/*.log,但要过滤/home/admin/app1*目录下的所有子目录,则需选择目录黑名单,配置目录为/home/admin/app1*/**。如果配置为/home/admin/app1*,黑名单不会生效。

      • 匹配黑名单过程存在计算开销,建议黑名单条目数控制在10条内。

      • 目录路径不能以正斜线(/)结尾,例如将设置路径为/home/admin/dir1/,目录黑名单不会生效。

      支持按照文件路径黑名单、文件黑名单、目录黑名单设置,详细说明如下:

      文件路径黑名单

      • 选择文件路径黑名单,配置路径为/home/admin/private*.log,则表示在采集时忽略/home/admin/目录下所有以private开头,以.log结尾的文件。

      • 选择文件路径黑名单,配置路径为/home/admin/private*/*_inner.log,则表示在采集时忽略/home/admin/目录下以private开头的目录内,以_inner.log结尾的文件。例如/home/admin/private/app_inner.log文件被忽略,/home/admin/private/app.log文件被采集。

      文件黑名单

      选择文件黑名单,配置文件名为app_inner.log,则表示采集时忽略所有名为app_inner.log的文件。

      目录黑名单

      • 选择目录黑名单,配置目录为/home/admin/dir1,则表示在采集时忽略/home/admin/dir1目录下的所有文件。

      • 选择目录黑名单,配置目录为/home/admin/dir*,则表示在采集时忽略/home/admin/目录下所有以dir开头的子目录下的文件。

      • 选择目录黑名单,配置目录为/home/admin/*/dir,则表示在采集时忽略/home/admin/目录下二级目录名为dir的子目录下的所有文件。例如/home/admin/a/dir目录下的文件被忽略,/home/admin/a/b/dir目录下的文件被采集。

      允许文件多次采集

      默认情况下,一个日志文件只能匹配一个Logtail配置。如果文件中的日志需要被采集多份,需要打开允许文件多次采集开关。

      高级参数

      其它可选的与文件输入插件相关的高级功能参数,请参见创建Logtail流水线配置

    • 处理配置

      配置项

      说明

      日志样例

      待采集日志的样例,请务必使用实际场景的日志。日志样例可协助您配置日志处理相关参数,降低配置难度。支持添加多条样例,总长度不超过1500个字符。

      [2023-10-01T10:30:01,000] [INFO] java.lang.Exception: exception happened
          at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
          at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
          at TestPrintStackTrace.main(TestPrintStackTrace.java:16)

      多行模式

      • 多行日志的类型:多行日志是指每条日志分布在连续的多行中,需要从日志内容中区分出每一条日志。

        • 自定义:通过行首正则表达式区分每一条日志。

        • 多行JSON:每个JSON对象被展开为多行,例如:

          {
            "name": "John Doe",
            "age": 30,
            "address": {
              "city": "New York",
              "country": "USA"
            }
          }
      • 切分失败处理方式:

        Exception in thread "main" java.lang.NullPointerException
            at com.example.MyClass.methodA(MyClass.java:12)
            at com.example.MyClass.methodB(MyClass.java:34)
            at com.example.MyClass.main(MyClass.java:½0)

        对于以上日志内容,如果日志服务切分失败:

        • 丢弃:直接丢弃这段日志。

        • 保留单行:将每行日志文本单独保留为一条日志,保留为一共四条日志。

      处理模式

      处理模式选择SPL

      SPL语句

      SPL语句具体请参考 SPL语法。解析日志前,日志默认存在content字段中。

      超时时间

      SPL语句执行一次的最大时间。