天天看點

如何在函數計算中使用結構化的使用者日志

目前函數計算預設會将使用者的标準輸出寫入到使用者指定的 logstore ,如果使用了

logger.log()

console.log()

這類函數還會帶上時間戳及requestID。

通常情況下,對于普通使用者來說這已經可以做一些問題調查和調試了。

但在很多情況下,我們可能需要做自定義的特定字段的查詢,例如比較數字大小,比較字元串長度,做柱狀圖、餅圖,曲線圖等等。本文會介紹如何在函數計算中使用

阿裡雲日志服務 建立 json 格式的日志來做結構化的日志輸出和查詢。

建立 logStore 并為 service 設定日志

本文假定您已經掌握了

函數計算控制台

的建立函數、調用函數等基本功能。

我們可以參考

這篇文章

,先開通日志服務,并為您的 service 增加日志記錄。

使用者函數如何記錄日志

特别注意的是:我們需要将 json 格式的整個對象序列化為一行,并輸出到标準輸出。

在 python 中,我們可以使用

print

或者

sys.stdout.write

,值得注意的是

sys.stdout.write

最後的換行符

\n

需要自己加上,否則上下文會串行導緻解析失敗。

我們先使用 python2.7 建立函數,複制下面的代碼,粘貼到編輯框儲存。

# -*- coding: utf-8 -*-
import json

def handler(event, context):
    print "hello function compute"
    print '{"name":"Amy", "sex":"female", "age":18, "city":"Beijing", "slogen":"function compute is awsome"}'
    print '{"name":"Alex", "sex":"male", "age":25, "city":"Shanghai", "opts":{"phone":12345678, "hobby":"basketball"}}'
    print '{"name":"Jack", "sex":"male", "age":35, "city":"Hangzhou", "opts":{"phone":23456789}}'
    print json.dumps({"msg":"test message", "requestID": context.request_id})
    return 'hello world'           

可以看到,我們的5個 print 中有3個都是标準的 json 字元串。

其中還有一個是我們使用

json.dumps

序列化的 json 字元串。

建議在後續的實際項目中使用

json.dumps

來做 json 字元串的序列化保證代碼的正确性,避免使用 string format 來做序列化。

對于nodejs的使用者,可以使用下面的代碼

module.exports.handler = function(event, context, callback) { 
    process.stdout.write('hello function compute\n');
    process.stdout.write('{"name":"Amy", "sex":"female", "age":18, "city":"Beijing", "slogen":"function compute is awsome"}\n');
    process.stdout.write('{"name":"Alex", "sex":"male", "age":25, "city":"Shanghai", "opts":{"phone":12345678, "hobby":"basketball"}}\n');
    process.stdout.write('{"name":"Jack", "sex":"male", "age":35, "city":"Hangzhou", "opts":{"phone":23456789}}\n');
    process.stdout.write(JSON.stringify({"msg":"test message", "requestID": context.requestID }) + '\n');
    callback(null, 'hello world'); 
};           

注意的是,nodejs中,我們不能使用

console.log()

來做輸出,而是使用

process.stdout.write()

,且需要加上最後的換行符。

配置日志索引

配置好函數後,我們來到對應的log store。

  • 點開

    查詢分析屬性>設定

    ,如圖:
如何在函數計算中使用結構化的使用者日志
  • 如圖,分别為各個字段建立索引
    • 為 message 建立 json 類型的索引
    • 為嵌套 json 類型

      opts.hobby

      建立 text 類型的索引
如何在函數計算中使用結構化的使用者日志
  • 确認儲存後我們可以嘗試調用函數

結構化的日志查詢和分析

函數調用成功後,我們使用日志查詢,預期可以看到如下結果:

如何在函數計算中使用結構化的使用者日志

關于如何使用日志服務的查詢語言,可以詳細參考[](

https://help.aliyun.com/document_detail/29060.html)

指定requestID 查詢

message.requestID: 7ec6a4bc-86fb-8dd9-7e1e-929a08316875           
如何在函數計算中使用結構化的使用者日志

組合條件查詢

message.age > 20 and message.sex = "male"           
如何在函數計算中使用結構化的使用者日志

嵌套查詢

message.opts.hobby = "basketball"           
如何在函數計算中使用結構化的使用者日志

結合SQL查詢分析

例如在上面的日志中,我們查詢分析

message.age < 20

message.age >= 20

的占比餅圖

詳細文法可參考

實時分析簡介
message.age >= 0 | SELECT case when "message.age" < 20 then '<20' else '>=20' end as age, count(1) group by age           
如何在函數計算中使用結構化的使用者日志