如何在函数计算中使用结构化的用户日志

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
函数计算FC,每月15万CU 3个月
简介: 本文会介绍如何在函数计算中使用阿里云日志服务创建 json 格式的日志来做结构化的日志输出和查询。

目前函数计算默认会将用户的标准输出写入到用户指定的 logstore ,如果使用了 logger.log() console.log() 这类函数还会带上时间戳及requestID。
通常情况下,对于普通用户来说这已经可以做一些问题调查和调试了。

但在很多情况下,我们可能需要做自定义的特定字段的查询,例如比较数字大小,比较字符串长度,做柱状图、饼图,曲线图等等。本文会介绍如何在函数计算中使用阿里云日志服务创建 json 格式的日志来做结构化的日志输出和查询。

创建 logStore 并为 service 设置日志

本文假定您已经掌握了函数计算控制台的创建函数、调用函数等基本功能。

我们可以参考这篇文章,先开通日志服务,并为您的 service 增加日志记录。

用户函数如何记录日志

特别注意的是:我们需要将 json 格式的整个对象序列化为一行,并输出到标准输出。

在 python 中,我们可以使用 print 或者 sys.stdout.write,值得注意的是 sys.stdout.write 最后的换行符 \n 需要自己加上,否则上下文会串行导致解析失败。如果使用 logging 模块,则需要注意日志的format格式,必须每行输出是一个标准的 json 文本。

我们先使用 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'
AI 代码解读

可以看到,我们的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'); 
};
AI 代码解读

注意的是,nodejs 中,我们不能使用 console.log() 来做直接输出,需要调整输出 format 为不带换行符的 json 文本,这里使用process.stdout.write() 做为示例,需要加上最后的换行符。

配置日志索引

配置好函数后,我们来到对应的log store。

  • 点开查询分析属性>设置,如图:

setting.png

  • 如图,分别为各个字段创建索引

    • 为 message 创建 json 类型的索引
    • 为嵌套 json 类型 opts.hobby 创建 text 类型的索引

index_setting.png

  • 确认保存后我们可以尝试调用函数

结构化的日志查询和分析

函数调用成功后,我们使用日志查询,预期可以看到如下结果:

all_logs.png

关于如何使用日志服务的查询语言,详细可以参考 链接

指定requestID 查询

message.requestID: 7ec6a4bc-86fb-8dd9-7e1e-929a08316875
AI 代码解读

query_3.png

组合条件查询

message.age > 20 and message.sex = "male"
AI 代码解读

query_1.png

嵌套查询

message.opts.hobby = "basketball"
AI 代码解读

query_2.png

结合SQL查询分析

例如在上面的日志中,我们查询分析 message.age < 20message.age >= 20 的占比饼图

详细语法可参考 实时分析简介

message.age >= 0 | SELECT case when "message.age" < 20 then '<20' else '>=20' end as age, count(1) group by age
AI 代码解读

pie_chart.png

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
打赏
0
相关文章
pip镜像源大全及配置
在中国使用pip时,可以配置国内镜像源来提高安装速度和稳定性。以下是一些常见的国内镜像源:
14059 0
【Docker】9、Docker-Compose安装轻量级分布式日志服务Graylog
Graylog 是一个开源的日志聚合、分析、审计、展现和预警工具。在功能上来说,和 ELK 类似,但又比 ELK 要简单很多。
2285 1
【Docker】9、Docker-Compose安装轻量级分布式日志服务Graylog
AntV X6源码探究简析
AntV是蚂蚁金服全新一代数据可视化解决方案,其中X6主要用于解决图编辑领域相关的解决方案,其是一款图编辑引擎,内置了一下编辑器所需的功能及组件等,本文旨在通过简要分析x6源码来对图编辑领域的一些底层引擎进行一个大致了解,同时也为团队中需要进行基于X6编辑引擎进行构建的图编辑器提供一些侧面了解,在碰到问题时可以较快的找到问题点。
649 0
Selenium常见报错问题(2)- 解决和分析StaleElementReferenceException异常
Selenium常见报错问题(2)- 解决和分析StaleElementReferenceException异常
1616 0
Selenium常见报错问题(2)- 解决和分析StaleElementReferenceException异常
对象存储OSS体验分享
对象存储OSS体验分享
371 5
从基础到进阶:掌握Java中的Servlet和JSP开发
【6月更文挑战第23天】Java Web开发中的Servlet和JSP是关键技术,用于构建动态网站。Servlet是服务器端小程序,处理HTTP请求,生命周期包括初始化、服务和销毁。基础Servlet示例展示了如何响应GET请求并返回HTML。随着复杂性增加,JSP以嵌入式Java代码简化页面创建,最佳实践提倡将业务逻辑(Servlet)与视图(JSP)分离,遵循MVC模式。安全性和性能优化,如输入验证、HTTPS、会话管理和缓存,是成功应用的关键。本文提供了一个全面的学习指南,适合各级开发者提升技能。
145 7
C++字符串string容器(构造、赋值、拼接、查找、替换、比较、存取、插入、删除、子串)
C++字符串string容器(构造、赋值、拼接、查找、替换、比较、存取、插入、删除、子串)
192 1
5 分钟上手函数计算
在使用函数计算前,您需要开通函数计算服务。本场景中提供的阿里云子账号无函数计算服务操作权限,请使用您自己的阿里云账号操作。您无需担心扣费问题,因为函数计算服务有一定的免费额度。
30832 0
5 分钟上手函数计算
构建三维一体立体化监控,看这一篇就够了!
如果你需要搭建一套能够立体化监控你的应用及业务,出现问题及时告警的监控体系,这篇文章应该是你所需要的!
698 0
构建三维一体立体化监控,看这一篇就够了!

相关产品

  • 函数计算
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等