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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
函数计算FC,每月15万CU 3个月
简介: 目前函数计算默认会将用户的标准输出写入到用户指定的 logstore ,如果使用了 `logger.log()` `console.log()` 这类函数还会带上时间戳及requestID。 通常情况下,对于普通用户来说这已经可以做一些问题调查和调试了。 但在很多情况下,我们可能需要做自定义的特定字段的查询,例如比较数字大小,比较字符串长度,做柱状图、饼图,曲线图等等。本文会介绍如何在函数

目前函数计算默认会将用户的标准输出写入到用户指定的 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。

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

setting.png

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

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

index_setting.png

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

结构化的日志查询和分析

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

all_logs.png

关于如何使用日志服务的查询语言,可以详细参考[](https://help.aliyun.com/document_detail/29060.html)

指定requestID 查询

message.requestID: 7ec6a4bc-86fb-8dd9-7e1e-929a08316875

query_3.png

组合条件查询

message.age > 20 and message.sex = "male"

query_1.png

嵌套查询

message.opts.hobby = "basketball"

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

pie_chart.png

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
28天前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
45 1
|
2月前
|
存储 运维 监控
Elasticsearch Serverless 高性价比智能日志分析关键技术解读
本文解析了Elasticsearch Serverless在智能日志分析领域的关键技术、优势及应用价值。
Elasticsearch Serverless 高性价比智能日志分析关键技术解读
|
4月前
|
存储 监控 Serverless
函数计算发布功能问题之用户在使用主流函数计算产品的日志服务时可能会遇到使用成本的问题如何解决
函数计算发布功能问题之用户在使用主流函数计算产品的日志服务时可能会遇到使用成本的问题如何解决
|
4月前
|
JavaScript 前端开发 Serverless
函数计算产品使用问题之打印日志时间与实际时间相差8小时,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
监控 Serverless 开发者
函数计算发布功能问题之查看函数的调用日志的问题如何解决
函数计算发布功能问题之查看函数的调用日志的问题如何解决
|
4月前
|
中间件 Go 数据库
slog 简介:用于 Go 的结构化日志
slog 简介:用于 Go 的结构化日志
|
4月前
|
JavaScript Serverless Linux
函数计算产品使用问题之遇到Node.js环境下的请求日志没有正常输出时,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
监控 Java Serverless
美团 Flink 大作业部署问题之想在Serverless平台上实时查看Spring Boot应用的日志要怎么操作
美团 Flink 大作业部署问题之想在Serverless平台上实时查看Spring Boot应用的日志要怎么操作
|
5月前
|
Java Serverless 应用服务中间件
函数计算操作报错合集之JVM启动时找不到指定的日志目录,该如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
数据采集 监控 Unix
性能监控之Telegraf+InfluxDB+Grafana实现结构化日志实时监控
【8月更文挑战第1天】性能监控之Telegraf+InfluxDB+Grafana实现结构化日志实时监控
342 0