本文介绍如何在自定义运行时中使用Loggie Agent从文件中采集日志并上传到阿里云日志服务SLS。

背景信息

Loggie是一个基于Golang的轻量级、高性能的云原生日志采集Agent。您可以使用Loggie的Sink配置,将采集到的日志上传到阿里云日志服务SLS。更多信息,请参见Loggie

自定义运行时支持Loggie Agent

Loggie Agent是一种外部扩展,以独立的进程运行。自定义运行时支持使用Loggie Agent,主要包括以下四部分。

使用公共层获取Loggie Agent程序

函数计算平台提供了支持自定义运行时的Loggie Agent公共层,最新版本如下。

兼容运行时公共层ARN
自定义运行时acs:fc:{region}:official:layers/Loggie13x/versions/1

添加Loggie配置文件

使用Loggie需要配置文件pipelines.ymlloggie.yml

  • pipelines.yml为Pipeline配置文件。示例如下:
    pipelines:
      - name: demo
        sources:
          - type: file
            name: fc-demo
            addonMeta: true
            fields:
              topic: "loggie"
            fieldsUnderRoot: true
            paths:
              - "/tmp/log/*.log"
        sink:
          type: sls
          endpoint: ${endpoint}
          accessKeyId: ${accessKeyId}
          accessKeySecret: ${accessKeySecret}
          project: ${project}
          logstore: ${logstore}
          topic: ${topic}
  • loggie.yml为Loggie的系统配置文件。loggie.yml文件默认内容为空。不为空时,其具体参数,请参见Loggie系统配置
说明 本文示例采用默认的文件配置方式,即pipelines.ymlloggie.yml必须同时存在。

使用Bootstrap脚本作为启动命令

可以在函数代码页面使用WebIDE创建bootstrap文件,并设置文件权限为可执行权限。示例代码如下所示。
#!/bin/bash

# 1. 创建pipelines.yml文件
mkdir -p /tmp/log /code/etc
cat << EOF > /code/etc/pipelines.yml
pipelines:
  - name: demo
    sources:
      - type: file
        name: fc-demo
        addonMeta: true
        fields:
          topic: "loggie"
        fieldsUnderRoot: true
        paths:
          - "/tmp/log/*.log"
    sink:
      type: sls
      endpoint: ${LOGGIE_SINK_SLS_ENDPOINT}
      accessKeyId: ${LOGGIE_SINK_SLS_ACCESS_ID}
      accessKeySecret: ${LOGGIE_SINK_SLS_ACCESS_SECRET}
      project: ${LOGGIE_SINK_SLS_PROJECT}
      logstore: ${LOGGIE_SINK_SLS_LOGSTORE}
      topic: ${LOGGIE_SINK_SLS_TOPIC}
EOF

# 2. 创建loggie.yml文件
cat << EOF > /code/etc/loggie.yml
EOF

# 3. 启动Loggie Agent,作为后台进程运行
/opt/bin/loggie -config.system=/code/etc/loggie.yml -config.pipeline=/code/etc/pipelines.yml > /tmp/loggie.log 2>&1 &

# 4. 启动应用程序
exec python app.py
                
脚本解析如下:
  1. 创建配置文件pipelines.yml
    • sources

      用于指定日志的类型和日志所在位置。本示例展示采集/tmp/log目录下所有以.log结尾的文件中的日志。

      sources配置中的addonMeta表示添加默认的日志采集state元信息。更多关于sources的配置,请参见Source通用配置

    • sink

      用于指定日志服务相关信息。关于参数的说明,请参见配置参数说明

  2. 创建配置文件loggie.yml。文件为空,表示为默认配置。本文示例采用默认配置方法,loggie.yml文件必须存在。
  3. 启动Loggie Agent,作为后台进程运行。Loggie Agent运行日志会打印到/tmp/loggie.log
  4. 启动应用程序。本文示例使用Python运行,请按照实际情况填写。

设置环境变量

  1. 设置环境变量FC_EXTENSION_SLS_LOGGIE=true

    添加该环境变量后,在一次函数调用结束时,不会立刻冻结函数实例,会等待10s再冻结函数实例,以确保Loggie Agent扩展成功上报日志。

    重要 该方式会有额外的收费,收费策略与实例的Prefreeze回调相同。具体信息,请参见计费说明
  2. 设置pipelines.yml中的环境变量,包括LOGGIE_SINK_SLS_ENDPOINTLOGGIE_SINK_SLS_ACCESS_IDLOGGIE_SINK_SLS_ACCESS_SECRETLOGGIE_SINK_SLS_PROJECTLOGGIE_SINK_SLS_LOGSTORELOGGIE_SINK_SLS_TOPIC

前提条件

重要 创建的日志项目必须和创建的函数在相同地域。

操作步骤

  1. 登录函数计算控制台,在左侧导航栏,单击服务及函数
  2. 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
  3. 函数管理页面,单击目标函数操作列的配置
  4. 在函数配置页面的区域,通过添加官方公共层添加Loggie层。
    关于层ARN信息,请参见使用公共层获取Loggie Agent程序
  5. 在函数代码页面的WebIDE中,创建文件bootstrap
    具体操作,请参见使用Bootstrap脚本作为启动命令
    说明 请按照实际情况修改应用程序启动命令。
  6. 在函数配置页面的环境变量区域,添加环境变量FC_EXTENSION_SLS_LOGGIE=truepipelines.yml依赖的5个环境变量。
    具体操作,请参见设置环境变量
    成功更新配置后,支持将函数执行日志通过Loggie上传到日志服务。

验证结果

登录日志服务控制台,按照pipelines.yml文件中配置的地域、Project和Logstore查询日志。示例如下。

custom-loggie-result
  • body:一条日志信息。本示例中为原始的单行文本数据,以换行符分割两条日志。
  • state.*:日志采集state元信息,其中hostname为函数运行所在的实例ID。

问题排查

Loggie Agent独立运行在函数实例中,函数计算平台无法感知Loggie Agent是否正常,Loggie Agent运行异常也不会影响函数的正常执行。

如果在日志服务中无法查询到Loggie Agent相关日志时(会有秒级的延时),可参考以下流程进行排查。

函数运行正常

如果函数运行正常,在调用后函数实例会存活一段时间(一般是几分钟),可以登录实例查看Loggie Agent的运行状态和日志信息。关于登录实例的具体操作,请参见函数实例命令行操作

  • 如果没有日志信息,可以在命令行尝试启动Loggie Agent。
  • 如果Loggie有日志信息,根据日志信息排查。
    • 确认pipelines.yml文件是否配置正确。
    • 确认是否成功启动SLS sink配置。日志类似pipeline sink(sink/sls)-0 invoke loop start
    • 确认是否获取到日志文件。日志类似start collect file: /tmp/log/fc-flask.log。如果没有类似日志,按照pipelines.yml文件配置中的paths路径,确认是否有日志文件产生。
说明 首次接入SLS Logstore可能会有一定延时,如果日志一切正常,可以多次触发调用函数,等待几分钟后再查询日志。

函数运行失败

Loggie Agent作为外部扩展,一般不会影响函数的正常运行,可以先将Loggie Agent启动逻辑移除,排查函数运行是否正常。如果出现进程异常退出或者执行超时的报错,可以尝试调大内存或CPU规格。

示例参考

  • Loggie-Interceptor

    示例中,Loggie采集到日志后原样上传,没有经过任何加工处理。如果需要对日志数据加工后再上传,例如解析JSON格式、移除DEBUG日志等,可以在pipelines.yml中添加Interceptor配置。

  • 示例应用程序(python3.9 flask)

    该应用可以快速部署一个由Custom-Python3.9事件类型实现的日志服务扩展到阿里云函数计算,使用该扩展可以实现采集日志文件并上报到日志服务。