本文介绍如何在自定义运行时中使用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.yml和loggie.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系统配置。
使用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
- 创建配置文件pipelines.yml。
sources
用于指定日志的类型和日志所在位置。本示例展示采集/tmp/log目录下所有以.log结尾的文件中的日志。
sources
配置中的addonMeta表示添加默认的日志采集state元信息。更多关于sources
的配置,请参见Source通用配置。sink
用于指定日志服务相关信息。关于参数的说明,请参见配置参数说明。
- 创建配置文件loggie.yml。文件为空,表示为默认配置。本文示例采用默认配置方法,loggie.yml文件必须存在。
- 启动Loggie Agent,作为后台进程运行。Loggie Agent运行日志会打印到/tmp/loggie.log。
- 启动应用程序。本文示例使用Python运行,请按照实际情况填写。
设置环境变量
- 设置环境变量
FC_EXTENSION_SLS_LOGGIE=true
添加该环境变量后,在一次函数调用结束时,不会立刻冻结函数实例,会等待10s再冻结函数实例,以确保Loggie Agent扩展成功上报日志。
重要 该方式会有额外的收费,收费策略与实例的Prefreeze回调相同。具体信息,请参见计费说明。 - 设置pipelines.yml中的环境变量,包括
LOGGIE_SINK_SLS_ENDPOINT
、LOGGIE_SINK_SLS_ACCESS_ID
、LOGGIE_SINK_SLS_ACCESS_SECRET
、LOGGIE_SINK_SLS_PROJECT
、LOGGIE_SINK_SLS_LOGSTORE
和LOGGIE_SINK_SLS_TOPIC
。
前提条件
- 已创建Custom Runtime函数。具体操作,请参见创建函数。
- 已创建日志项目和日志库。具体操作,请参见创建Project和创建Logstore。
操作步骤
- 登录函数计算控制台,在左侧导航栏,单击服务及函数。
- 在顶部菜单栏,选择地域,然后在服务列表页面,单击目标服务。
- 在函数管理页面,单击目标函数操作列的配置。
- 在函数配置页面的层区域,通过添加官方公共层添加Loggie层。关于层ARN信息,请参见使用公共层获取Loggie Agent程序。
- 在函数代码页面的WebIDE中,创建文件
bootstrap
。具体操作,请参见使用Bootstrap脚本作为启动命令。说明 请按照实际情况修改应用程序启动命令。 - 在函数配置页面的环境变量区域,添加环境变量
FC_EXTENSION_SLS_LOGGIE=true
和pipelines.yml依赖的5个环境变量。具体操作,请参见设置环境变量。成功更新配置后,支持将函数执行日志通过Loggie上传到日志服务。
验证结果
登录日志服务控制台,按照pipelines.yml文件中配置的地域、Project和Logstore查询日志。示例如下。

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
路径,确认是否有日志文件产生。
函数运行失败
Loggie Agent作为外部扩展,一般不会影响函数的正常运行,可以先将Loggie Agent启动逻辑移除,排查函数运行是否正常。如果出现进程异常退出或者执行超时的报错,可以尝试调大内存或CPU规格。
示例参考
- Loggie-Interceptor
示例中,Loggie采集到日志后原样上传,没有经过任何加工处理。如果需要对日志数据加工后再上传,例如解析JSON格式、移除DEBUG日志等,可以在pipelines.yml中添加Interceptor配置。
- 示例应用程序(python3.9 flask)
该应用可以快速部署一个由Custom-Python3.9事件类型实现的日志服务扩展到阿里云函数计算,使用该扩展可以实现采集日志文件并上报到日志服务。