Node.js SDK快速入门

本文介绍如何快速使用日志服务Node.js SDK完成常见操作,包括创建项目(Project)、创建日志库(Logstore)、写入日志和查询日志等。

前提条件

注意事项

本示例以华东1(杭州)的公网Endpoint为例,其公网Endpointhttps://cn-hangzhou.log.aliyuncs.com。如果您通过与Project同地域的其他阿里云产品访问日志服务,请使用内网Endpointhttps://cn-hangzhou-intranet.log.aliyuncs.com。关于日志服务支持的地域与Endpoint的对应关系,请参见服务入口

参数说明

createProject

请求参数

变量

类型

是否必填

说明

projectName

String

Project名称全局唯一,且创建后不可修改。

其命名规则如下:

  • 仅支持小写字母、数字和连字符(-)。

  • 必须以小写字母开头,以小写字母和数字结尾

  • 名称长度为3~63个字符。

description

String

Project的描述:不支持尖括号(<>)、撇号(')、反斜线(\)、双引号(")和两个反斜线(\\),最多包含64个字符。

resourceGroupId

String

资源组ID,如果不指定,将使用默认资源组。更多信息,请参见创建资源组

dataRedundancyType

String

默认使用本地冗余存储,部分地域提供本地冗余存储和同城冗余存储两种存储冗余类型,Project创建后不支持修改冗余存储类型。更多信息,请参见存储冗余

  • LRS:本地冗余存储

  • ZRS:同城冗余存储

返回参数

返回参数请参见:CreateProject - 创建Project

createLogStore

请求参数

变量

类型

是否必填

说明

projectName

String

Project名称:项目(Project)是日志服务的资源管理单元,是进行多用户隔离与访问控制的主要边界。更多信息,请参见管理Project

logstoreName

String

Logstore名称Project中全局唯一,且创建后不可修改。

其命名规则如下:

  • 仅支持小写字母、数字、连字符(-)和下划线(_)。

  • 必须以小写字母开头,以小写字母和数字结尾。

  • 名称长度为3~63个字符。

ttl

int

数据保存时间,单位为天。取值范围:1~3650,如果配置为3650,表示永久保存。当设置的保存期限到达时,日志将被删除。

数据保存时间(ttl)是以下三部分时间的总和:

  • 热存储数据保存时间(hotTtl

  • 低频存储数据保存时间(infrequentAccessTtl

  • 归档存储数据保存时间

shardCount

int

分区(Shard)数量。取值范围为1~10。更多信息,请参见Shard范围

enableTracking

bool

是否启用WebTracking

  • True:开启WebTracking功能,则表示该Logstore开启互联网匿名写入权限,没有经过有效鉴权,可能产生脏数据。

  • False(默认值):关闭WebTracking

说明

WebTracking支持快速采集各种浏览器以及iOS/Android/APP的访问信息。更多信息,请参见使用Web Tracking采集日志

appendMeta

bool

是否开启记录外网IP功能。

  • True:开启记录外网IP功能,开启后日志服务自动把以下信息添加到日志的Tag字段中。

    • __client_ip__:客户端外网IP。

    • __receive_time__:日志到达时间,格式为Unix时间戳。

  • False(默认值):不开启记录外网IP功能。

autoSplit

bool

是否开启自动分裂Shard

maxSplitShard

int

最大分裂数:开启自动分裂Shard后,最大可支持自动分裂至256个分区。当auto_split参数为True时必须设置。

重要

auto_splitTrue时必须指定。

encryptConf

dict

加密配置数据结构,包含参数enableencrypt_typeuser_cmk_info。更多信息,请参见EncryptConf数据加密

telemetryType

String

可观测数据类型。取值包括:

  • None:日志数据。默认为日志数据。

  • Metrics:时序数据。此时只有以下参数生效:

    • logstoreName

    • ttl

    • shardCount

    • autoSplit

    • maxSplitShard

    • appendMeta

重要

此参数创建后不可修改

hotTtl

int

数据在Logstore热存储层中的存储时间,单位为天。最小为7,最大不能超过ttl的值,取值为-1代表保存时间ttl内全是热存储。

当数据的存储时间超过您所配置的热存储层数据保存时间后,数据将转为低频存储。关于热存储、低频存储、归档存储的概念和转换流程,请参见管理智能存储分层

  • 热存储数据至少需要保存7天才能转换为低频存储,低频存储至少需要保存30天才能转换为归档存储。

  • 热存储数据至少需要保存30天才能转换为归档存储。

mode

String

日志服务提供Standard(标准型)和Query(查询型)两种类型的Logstore。

  • standard(默认值):支持日志服务一站式数据分析功能,适用于实时监控、交互式分析以及构建完整的可观测性系统等场景。

  • query:支持高性能查询,索引流量费用约为Standard的一半,但不支持SELECT语句,适用于数据量大、存储周期长(周、月级别以上)或无日志分析的场景。

更多信息,请参见Logstore类型对比

infrequentAccessTtl

int

数据在Logstore低频存储层中的存储时间,单位:天。低频存储数据至少需要保存30天才能转换为归档存储。更多信息,请参见管理智能存储分层

返回参数

返回参数请参见:CreateLogStore - 创建LogStore

createIndex

请求参数

名称

类型

是否必填

说明

projectName

String

Project名称:项目(Project)是日志服务的资源管理单元,是进行多用户隔离与访问控制的主要边界。更多信息,请参见管理Project

logstoreName

String

Logstore名称:Logstore是日志服务中日志数据的采集、存储和查询单元。更多信息,请参见管理Logstore

index

index

索引配置信息。

返回参数

返回参数请参见:CreateIndex - 创建索引

getLogs

请求参数

名称

类型

是否必填

说明

projectName

String

Project名称:项目(Project)是日志服务的资源管理单元,是进行多用户隔离与访问控制的主要边界。更多信息,请参见管理Project

logstoreName

String

Logstore名称:Logstore是日志服务中日志数据的采集、存储和查询单元。更多信息,请参见管理Logstore

from

int

查询开始的时间点,使用Unix时间戳格式。

说明
  • 该时间为日志到达Logstore的时间。更多信息,请参见保留字段__tag__:__receive_time__

  • 开始时间点和结束时间点定义的时间区间。遵循左闭右开原则,即该时间区间包括区间开始时间点,但不包括区间结束时间点。如果开始时间点和结束时间点相同,则为无效区间,函数直接返回错误。

  • 如果您要确保不漏查数据,请将查询时间对齐到分钟级别。如果您在分析语句中设置了时间范围,则查询分析时以该时间范围为准。

  • 如果您需要在分析语句中指定时间范围并精确到秒时,可使用日期和时间函数或日期和时间函数转换下时间格式。例如:

    • * | SELECT * FROM log WHERE from_unixtime(__time__) > from_unixtime(1664186624) AND from_unixtime(__time__) < now()

    • * | SELECT * FROM log WHERE __time__ > to_unixtime(date_parse('2022-10-19 15:46:05', '%Y-%m-%d %H:%i:%s')) AND __time__ < to_unixtime(now())

to

int

查询结束的时间点,使用Unix时间戳格式。

说明
  • 该时间为日志到达Logstore的时间。更多信息,请参见保留字段__tag__:__receive_time__

  • 开始时间点和结束时间点定义的时间区间。遵循左闭右开原则,即该时间区间包括区间开始时间点,但不包括区间结束时间点。如果开始时间点和结束时间点相同,则为无效区间,函数直接返回错误。

  • 如果您要确保不漏查数据,请将查询时间对齐到分钟级别。如果您在分析语句中设置了时间范围,则查询分析时以该时间范围为准。

  • 如果您需要在分析语句中指定时间范围并精确到秒时,可使用日期和时间函数或日期和时间函数转换下时间格式。例如:

    • * | SELECT * FROM log WHERE from_unixtime(__time__) > from_unixtime(1664186624) AND from_unixtime(__time__) < now()

    • * | SELECT * FROM log WHERE __time__ > to_unixtime(date_parse('2022-10-19 15:46:05', '%Y-%m-%d %H:%i:%s')) AND __time__ < to_unixtime(now())

topic

String

日志主题。默认值为空字符串。更多信息,请参见日志主题(Topic)

query

String

查询语句或分析语句。更多信息,请参见查询与分析概述。 在query参数的分析语句中加上set session parallel_sql=true;,表示使用 SQL 独享版。例如* | set session parallel_sql=true; select count(*) as pv。常见查询与分析问题,请参见查询与分析日志的常见报错

说明

query参数中有分析语句(SQL 语句)时,该接口的line参数和offset参数无效。建议设置该接口的参数为0,需通过SQL语句的LIMIT语法实现翻页。更多信息,请参见分页显示查询分析结果

line

int

仅当query参数为查询语句时,该参数有效。表示请求返回的最大日志条数,最小值为 0,最大值为 100,默认值为 100。

offset

int

仅当query参数为查询语句时,该参数有效。表示查询开始行。默认值为 0。

reverse

bool

用于指定返回结果是否按日志时间戳降序返回日志,精确到分钟级别。

  • True:按照日志时间戳降序返回日志。

  • False(默认值):按照日志时间戳升序返回日志。

重要
  • query参数为查询语句时,参数reverse有效,用于指定返回日志排序方式。

  • query参数为查询和分析语句时,参数reverse无效,由SQL分析语句中order by指定排序方式。

powerSql

bool

是否使用SQL独享版。更多信息,请参见高性能完全精确查询与分析(SQL独享版)

  • True:使用SQL独享版。

  • False(默认值):使用SQL普通版。

除通过powerSql参数配置SQL独享版外,您还可以使用query参数。

返回参数

返回参数请参见:GetLogs - 查询日志库日志

示例

编写Node.js代码采集日志

本示例中,创建一个SLSQuickStart.js文件,并调用接口分别完成创建Project、创建Logstore、创建索引、写入日志数据和查询日志数据。以下为示例代码:


const Client = require('@alicloud/log')
const sls = new Client({
    // 本示例从环境变量中获取AccessKey ID和AccessKey Secret。
    accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
    accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
    //日志服务的域名。此处以杭州为例,其它地域请根据实际情况填写。 
    endpoint: 'cn-hangzhou.log.aliyuncs.com'
})
// 必选,Project名称。
const projectName = "aliyun-test-node-project"
// 必选,Logstore名称。
const logstoreName = "request_log"


async function test() {
    // 创建Project
    await sls.createProject(projectName, {
        description: 'test'
    })
    // 创建Logstore
    await sls.createLogStore(projectName, logstoreName, {
        // 必选,设置数据保存时长,单位为天。如果ttl配置为3650,表示永久保存。
        ttl: 3600,
        // 必选,设置Shard数量。
        shardCount: 2
    })
    // 创建index
    const index = {
        "keys": {
            "request_method": {
                // 是否大小写敏感  false为大小写不敏感。
                "caseSensitive": false,
                // 是否对该字段开启统计分析
                "doc_value": true,
                "token": ["\n", "\t", ";", ",", "=", ":"],
                "type": "text"
            }, "status": {
                // 是否大小写敏感  false为大小写不敏感。
                "caseSensitive": false,
                // 是否对该字段开启统计分析
                "doc_value": true,
                "token": ["\n", "\t", ";", ",", "=", ":"],
                "type": "long"
            }
        },
    }
    await sls.createIndex(projectName, logstoreName, index)
    // 写入日志
    const logGroup = {
        logs: [
          { content: { request_method: 'GET', status: '200' }, timestamp: Math.floor(new Date().getTime() / 1000) },
          { content: { request_method: 'GET', status: '500' }, timestamp: Math.floor(new Date().getTime() / 1000) },
          { content: { request_method: 'GET', status: '200' }, timestamp: Math.floor(new Date().getTime() / 1000) },
          { content: { request_method: 'POST', status: '500'}, timestamp: Math.floor(new Date().getTime() / 1000) }
        ],
        tags: [{ tag1: 'testTag' }],
        topic: 'testTopic',
        source: 'testSource'
      };
      await sls.postLogStoreLogs(projectName, logstoreName, logGroup);
      // 查询日志示例1:查询最近1天的日志数据。
      const from = new Date();
      from.setDate(from.getDate() - 1);
      const to = new Date();
      const res = await sls.getLogs(projectName, logstoreName, from, to);
      
      // 查询日志示例2:通过query分析语句,统计最近10分钟的日志条数。
      // const from = new Date();
      // from.setSeconds(from.getSeconds() - 600)
      // const to = new Date();
      // query = '* | select count(*) as count';
      // topic = 'testTopic';
    
      // const res = await sls.getLogs(projectName,logstoreName,from,to,{
      //     query: query,
      //     topic: topic,
      //     line: 100,
      //     offset: 0,
      //     reverse: false,
      //     powersql: false
      // });
      
      console.log(res)
}
// 运行function。
test()

返回结果示例如下:

[
  {
    request_method: 'GET',
    status: '200',
    __topic__: 'testTopic',
    __source__: 'testSource',
    '__tag__:tag1': 'testTag',
    __time__: '1744882259'
  },
  {
    request_method: 'GET',
    status: '500',
    __topic__: 'testTopic',
    __source__: 'testSource',
    '__tag__:tag1': 'testTag',
    __time__: '1744882259'
  },
  {
    request_method: 'GET',
    status: '200',
    __topic__: 'testTopic',
    __source__: 'testSource',
    '__tag__:tag1': 'testTag',
    __time__: '1744882259'
  },
  {
    request_method: 'POST',
    status: '500',
    __topic__: 'testTopic',
    __source__: 'testSource',
    '__tag__:tag1': 'testTag',
    __time__: '1744882259'
  }
]

更多示例代码如下表,方便您参考或直接使用。

GitHub源码

说明

integration.test.js

创建Project、创建Logstore、创建索引、写入日志、查询日志、查询Logstore、获取日志分布情况等相关示例。

通过Logtail采集Node.js日志

通过Logtail方式,以采集Node.jslog4js日志为例,请参见采集Node.js日志