Loggie是一個基於Golang的輕量級、高效能的雲原生日誌採集Agent。您可以在自訂運行時的函數中使用Loggie Agent從檔案中採集日誌,然後上傳到Log ServiceSLS進行日誌的儲存和自訂分析。
前提條件
Function Compute:建立服務。
Log ServiceSLS:建立專案Project和建立Logstore。
說明建立的記錄項目必須和步驟一要建立的函數在相同地區。
操作步驟
步驟一:建立自訂運行時函數
- 登入Function Compute控制台,在左側導覽列,單擊服務及函數。
- 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
在函數管理頁面,單擊建立函數。
在建立函數頁面,配置以下配置項,其他配置項使用預設值,然後單擊建立。詳細內容請參見建立函數。
建立函數的方式:使用自訂運行時建立。
基本設定:設定函數名稱,請求處理常式類型選擇處理事件請求。
函數代碼:配置函數的運行環境和代碼相關資訊。
配置項
樣本
運行環境
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結尾的檔案中的日誌。
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擴充成功上報日誌。
重要該方式會有額外的收費,收費策略與執行個體的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
。
單擊確定。函數配置更新後,可以支援將函數執行日誌通過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。