Loggie是一個基于Golang的輕量級、高性能的云原生日志采集Agent。您可以在自定義運行時的函數中使用Loggie Agent從文件中采集日志,然后上傳到日志服務SLS進行日志的存儲和自定義分析。
前提條件
已創建日志項目和日志庫。具體操作,請參見創建項目Project和創建Logstore。
創建的日志項目必須和要創建的函數在相同地域。
操作步驟
步驟一:創建函數
登錄函數計算控制臺,在左側導航欄,單擊函數。
在頂部菜單欄,選擇地域,然后在函數頁面,單擊創建函數。
在創建函數頁面,配置以下配置項,其他配置項使用默認值,然后單擊創建。詳細內容請參見創建函數。
創建函數的方式:Web函數。
基本設置:設置函數名稱。
函數代碼:配置函數的運行環境和代碼相關信息。
配置項
示例
運行環境
Python 3.9
代碼上傳方式
選擇通過文件夾上傳代碼。其中上傳的文件夾名稱為
code
,code
目錄下的文件為app.py
。app.py
的代碼示例內容如下。from flask import Flask from flask import request import logging import os REQUEST_ID_HEADER = 'x-fc-request-id' app = Flask(__name__) format_str = '[%(asctime)s] %(levelname)s in %(module)s: %(message)s' logging.basicConfig(filename='/tmp/log/fc-flask.log', filemode='w', format=format_str, encoding='utf-8', level=logging.DEBUG) @app.route("/invoke", methods = ["POST"]) def hello_world(): rid = request.headers.get(REQUEST_ID_HEADER) logger = logging.getLogger() print("FC Invoke Start RequestId: " + rid) logger.info("FC Invoke Start RequestId: " + rid) data = request.stream.read() print(str(data)) logger.info("receive event: {}".format(str(data))) print("FC Invoke End RequestId: " + rid) logger.info("FC Invoke Start RequestId: " + rid) return "Hello, World!" if __name__ == '__main__': app.run(host='0.0.0.0',port=9000)
說明您可以修改代碼中配置的
filename='/tmp/log/fc-flask.log'
為指定的日志類型及日志位置,該配置需要和步驟二中的sources.paths
路徑保持一致。啟動命令
/code/bootstrap
說明bootstrap文件在步驟二會創建。
監聽端口
9000
步驟二:創建bootstrap文件作為啟動命令
函數創建成功后,在代碼頁簽使用WebIDE在
code
目錄下創建bootstrap
文件。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,pipelines.yml為Pipeline配置文件。
sources
用于指定日志的類型和日志所在位置。本示例展示如何采集/tmp/log目錄下所有以.log結尾的文件中的日志。
sources
配置中的addonMeta表示添加默認的日志采集state元信息。更多關于sources
的配置,請參見Source通用配置。sink
創建配置文件loggie.yml,loggie.yml為Loggie的系統配置文件。
文件為空,表示為默認配置。本文示例采用默認配置方法,loggie.yml文件必須存在。文件不為空時,其具體參數請參見Loggie系統配置。
啟動Loggie Agent,作為后臺進程運行。Loggie Agent運行日志會打印到/tmp/loggie.log。
啟動應用程序。本文示例使用Python運行,請按照實際情況填寫。
設置
bootstrap
文件權限為可執行權限。在WebIDE中選擇
,執行chmod 777 bootstrap
命令設置文件權限。單擊部署代碼,完成代碼的部署。
步驟三:添加官方公共層Loggie Agent
單擊配置頁簽,選擇左側層頁簽,在層區域單擊編輯。
在編輯函數層面板,選擇
,配置Loggie Agent。關于Loggie Agent公共層的相關信息如下。
層名稱
兼容的運行時
層版本
ARN
Loggie Agent
自定義運行時
本文示例使用層版本1。
acs:fc:{region}:official:layers/Loggie13x/versions/1
單擊部署,完成Loggie Agent層的添加。
步驟四:設置環境變量
在配置頁簽,選擇左側環境變量頁簽,單擊編輯。
在編輯函數環境變量面板,添加如下環境變量。關于如何配置環境變量,請參見配置環境變量。
設置環境變量
FC_EXTENSION_SLS_LOGGIE=true
。添加該環境變量后,在一次函數調用結束時,不會立刻凍結函數實例,會等待10s再凍結函數實例,以確保Loggie Agent擴展成功上報日志。
重要函數計算在調用結束至凍結前的等待時長會產生費用,收費策略與實例調用階段的計費邏輯相同。具體信息,請參見產品計費。
設置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
。環境變量
說明
LOGGIE_SINK_SLS_ENDPOINT
日志服務的服務入口。更多信息,請參見服務入口。
LOGGIE_SINK_SLS_ACCESS_ID
阿里云AccessKey ID。如何獲取AccessKey ID,請參見訪問密鑰。
LOGGIE_SINK_SLS_ACCESS_SECRET
阿里云AccessKey Secret。如何獲取AccessKey Secret,請參見訪問密鑰。
LOGGIE_SINK_SLS_PROJECT
目標Logstore所在的Project。
LOGGIE_SINK_SLS_LOGSTORE
用于存儲日志的Logstore。
LOGGIE_SINK_SLS_TOPIC
日志主題,自定義設置。
單擊部署。函數配置更新后,可以支持將函數執行日志通過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
路徑,確認是否有日志文件產生。
首次接入SLS Logstore可能會有一定延時,如果日志一切正常,可以多次觸發調用函數,等待幾分鐘后再查詢日志。
函數運行失敗
Loggie Agent作為外部擴展,一般不會影響函數的正常運行,可以先將Loggie Agent啟動邏輯移除,排查函數運行是否正常。如果出現進程異常退出或者執行超時的報錯,可以嘗試調大內存或CPU規格。
相關文檔
關于Loggie的更多信息,請參見Loggie簡介。
在本文示例中,Loggie采集到日志后原樣上傳,沒有經過任何加工處理。如果需要對日志數據加工后再上傳,例如解析JSON格式、移除DEBUG日志等,可以在pipelines.yml中添加Interceptor配置,具體請參見Loggie-Interceptor 。
如果您希望通過Serverless Devs工具部署一個由Custom-Python3.9事件類型實現的將采集日志文件上報到日志服務的函數,請參見示例應用程序(python3.9 flask)。