Loggie是一個基於Golang的輕量級、高效能的雲原生日誌採集Agent。您可以在自訂運行時的函數中使用Loggie Agent從檔案中採集日誌,然後上傳到Log ServiceSLS進行日誌的儲存和自訂分析。
前提條件
已建立記錄項目和日誌庫。具體操作,請參見建立專案Project和建立Logstore。
建立的記錄項目必須和要建立的函數在相同地區。
操作步驟
步驟一:建立函數
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊建立函數。
在建立函數頁面,配置以下配置項,其他配置項使用預設值,然後單擊建立。詳細內容請參見建立函數。
建立函數的方式: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
用於指定Log Service相關資訊。指令碼中的變數會在步驟四設定。
建立設定檔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擴充成功上報日誌。
重要Function Compute在調用結束至凍結前的等待時間長度會產生費用,收費策略與執行個體調用階段的計費邏輯相同。具體資訊,請參見產品計費。
設定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
Log Service的服務入口。更多資訊,請參見服務入口。
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上傳到Log Service。
步驟四:驗證結果
在代碼頁簽,單擊測試函數,通過控制台調試函數。
配置完成後,首次調試日誌可能會有一些延遲,建議多調用幾次。
登入Log Service控制台,按照pipelines.yml檔案中配置的地區、Project和Logstore查詢日誌。樣本如下。
body
:日誌資訊。state.*
:日誌採集state元資訊,其中hostname
為函數運行所在的執行個體ID。
問題排查
Loggie Agent獨立運行在函數執行個體中,Function Compute平台無法感知Loggie Agent是否正常,Loggie Agent運行異常也不會影響函數的正常執行。
如果在Log Service中無法查詢到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。