目前函數計算預設會将使用者的标準輸出寫入到使用者指定的 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 類型
建立 text 類型的索引opts.hobby
- 确認儲存後我們可以嘗試調用函數
結構化的日志查詢和分析
函數調用成功後,我們使用日志查詢,預期可以看到如下結果:
關于如何使用日志服務的查詢語言,可以詳細參考[](
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