赛尔校园公共服务平台 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
赛尔校园公共服务平台 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 日志服务
  4. 操作指南
  5. 查询与分析
  6. 通过索引模式查询和分析日志
  7. 查询语法与功能
  8. 高精度时间戳(精确到纳秒)和全局排序

高精度时间戳(精确到纳秒)和全局排序

  • 查询语法与功能
  • 发布于 2025-04-22
  • 0 次阅读
文档编辑
文档编辑

本文主要介绍日志服务支持通过高精度时间戳(精确到纳秒)进行数据的全局排序,给您提供更加精准、可靠的时间顺序视图。

SLS支持全局有序和高精度时间戳

当前SLS已经支持高精度时间戳功能,并且直接按照纳秒级别进行全局排序。

相比老的非高精度时间戳的版本,在以下PB格式新增了一个可选的Time_ns字段, 在开启高精度时间戳功能的时候,用来存放日志时间里面的纳秒部分。之所以新增一个字段,而没有修改Time字段的类型主要是为了兼容历史数据。

image.png

SLS会基于Time和Time_ns组合出来的纳秒时间全局排序,控制台序查询结果如下图所示:

image.png

基本原理

日志写入SLS的时候可能会落在不同的Shard里面,在查询的时候根据查询条件和查询时间范围,通过倒排索引和写入过程中存放的高精度时间信息来将各个shard内部满足条件的log过滤出来并返回给中间节点做进一步的全局排序处理,中间节点处理后再返回。

  • 写入

    image.png

  • 查询

    image.png

注意事项

  • Logtail

    Logtail1.8及以上版本支持

如何开启全局有序和纳秒高精度时间戳

从有序业务场景章节我们了解了全局有序对业务的重要性,您使用该功能,需要从数据写入和查询两方面入手,其中数据写入主要有两类途径:Logtail和SDK。

数据写入

  • Logtail

    Logtail可以帮助您无侵入式从服务器或容器中采集文件和标准输出日志,Logtail 1.8及以上版本支持纳秒高精度时间戳。具体操作,请参见日志采集支持纳秒精度时间戳。如何安装和升级Logtail,请参见安装Logtail(Linux系统)。

    • 安装命令

      ./logtail.sh install {region}
    • 升级命令

      ./logtail.sh upgrade

      以上命令都可以使用-v参数指定版本,如

      ./logtail.sh upgrade -v 1.8.7
  • SDK

    当前GO SDK、C++ SDK、Java SDK、Python SDK支持纳秒时间的日志,其他语言的SDK,请提交工单。

    下述代码示例为写入带有纳秒时间的日志。您可以根据具体业务需要,解析日志中正确的纳秒时间部分传入。在查询时,使用秒和纳秒两者拼接的时间进行全局排序。

    Python

    重要

    Python SDK 支持纳秒高精度,目前发布在pyPI官方源,如果在国内用pip install -U aliyun-log-python-sdk没有拉取到纳秒版本,可以用pip install -U aliyun-log-python-sdk==0.8.11获取。

    def put_log_with_nano():
      logitemList = []
      for i in range(30):
        contents = [
            ('DeviceIP', 11.22.xx.xx)
        ]
        logItem = LogItem()
        nano_time = time.time_ns()
        sec_time = int(nano_time / 1000000000);
        nano_time_part = nano_time % 1000000000;
        logItem.set_time(sec_time)
        logItem.set_time_nano_part(nano_time_part)
        logItem.set_contents(contents)
        logitemList.append(logItem)
      request = PutLogsRequest(_project, _logstore, logitems=logitemList)
      res = client.put_logs(request)
      res.log_print()

    Java

    重要

    建议您获取日志服务Java SDK的最新版本进行调试,避免报错。日志服务Java SDK版本请参见Aliyun Log Java SDK。

    package com.aliyun.openservices.log;
    
    import com.aliyun.openservices.log.common.LogItem;
    import com.aliyun.openservices.log.exception.LogException;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ClientDemo {
        public static void main(String[] args) {
            Client client = new Client("cn-hangzhou.log.aliyuncs.com", "accessKeyId", "accessKeySecret");
            List<LogItem> logItems = new ArrayList<LogItem>();
            for (int i = 0; i < 10; i++) {
                LogItem logItem = new LogItem();
                // set time in second
                logItem.SetTime((int)(System.currentTimeMillis() / 1000));
                // set nano time
                logItem.SetTimeNsPart((int)(System.nanoTime() % 1000000000));
                logItem.PushBack("hello", "world");
                logItem.PushBack("test", "sls");
                logItems.add(logItem);
            }
            try{
                client.PutLogs("test-project", "test-logstore", "test-topic", logItems, "127.0.0.1");
            }catch(LogException e)
            {
                e.printStackTrace();
            }
    
        }
    }

    Go

    import (
    	"time"
    
    	sls "github.com/aliyun/aliyun-log-go-sdk"
    	"github.com/golang/protobuf/proto"
    )
    
    func main() {
    	client := sls.CreateNormalInterface("cn-hangzhou.log.aliyuncs.com", "accessKeyId", "accessKeySecret", "")
    
    	lg := &sls.LogGroup{
    		Logs: []*sls.Log{
    			{
    				// time in seconds
    				Time: proto.Uint32(uint32(time.Now().Unix())),
    				// nano time
    				TimeNs: proto.Uint32(uint32(time.Now().UnixNano() % 1e9)),
    				Contents: []*sls.LogContent{
    					{
    						Key:   proto.String("hello"),
    						Value: proto.String("world"),
    					},
    					{
    						Key:   proto.String("test"),
    						Value: proto.String("sls"),
    					},
    				},
    			},
    		},
    	}
    	err := client.PutLogs("test-project", "test-logstore", lg)
    	if err != nil {
    		panic(err)
    	}
    }
    

数据查询

  • 控制台

    SLS控制台,会根据高精度的时间信息,自动进行显示优化,显示成毫秒、微秒、纳秒的形式。

    • 微秒形式

      image.png

    • 纳秒形式

      image.png

  • SDK

以Python 为例, 捞取[1696743635 s, 1696743635 s +10 ns)区间内满足myQuery查询条件的最多100行log,并以逆序输出返回结果。

新增参数说明:

  1. accurate_query设置为true默认走精确查询, 在设置为false情况下,只能保证分钟级别有序。

  2. from_time_nano_part和to_time_nano_part 会分别和fromTime、toTime组合成nano时间范围去SLS查询,SLS会过滤出在这段纳秒时间范围内的满足查询条件的log,并以纳秒时间戳粒度有序输出。

    def query_log_with_nano():
        query = "LEVEL:ERROR"
        req = GetLogsRequest(_project, _logstore, fromTime=1696743635, toTime=1696743635, query=query, line=100, reverse=True, accurate_query=True, from_time_nano_part=0, to_time_nano_part = 10)
        res = client.get_logs(req)
        res.log_print()
相关文章

短语查询 2025-04-22 10:58

本文介绍短语查询的语法、使用限制和示例。 概述 日志服务查询采用的是分词法,例如查询语句为

LiveTail 2025-04-22 10:58

在线上运维的场景中,经常需要实时监控日志并提取关键信息、分析异常原因。您可以通过LiveTail功能,实时监控、过滤日志,无需直接操作服务器。 前提条件 已通过Logtail采集到日志。具体操作,请参见通过Logtail采集日志</

日志聚类 2025-04-22 10:58

本文介绍日志聚类功能及其操作,包括开启日志聚类、查看聚类结果和原始日志、对比不同时间段的聚类日志数量等。 前提条件

上下文查询 2025-04-22 10:58

开发人员无需登录服务器,在大量日志中通过关键字检索日志,日志服务支持通过控制台查看指定日志在原始文件中的上下文信息。 前提条件

快速查询 2025-04-22 10:58

当您需要频繁查看某一查询和分析语句的结果时,可以将该查询和分析语句另存为快速查询。快速查询是日志服务提供的用于保存查询和分析操作的功能。您可通过保存的历史操作,快速执行查询和分析操作。 前提条件 已创建索

字段设置 2025-04-22 10:58

日志服务支持您进行字段设置,从而提升一键式交互查询体验,帮助您快速分析某一字段在指定时间内的分布情况。 前提条件

目录
Copyright © 2025 your company All Rights Reserved. Powered by 赛尔网络.
京ICP备14022346号-15
gongan beian 京公网安备11010802041014号