精通日志查询: 如何翻页获取日志和计算结果-阿里云开发者社区

开发者社区> 云雷> 正文

精通日志查询: 如何翻页获取日志和计算结果

简介: 精通日志查询: 如何翻页获取日志和计算结果 日志服务提供一站式的日志采集、存储、查询、计算功能。交互式的日志采集体验,释放用户的运维压力,解放用户的双手; 交互式的查询分析体验,让用户自由的构建数据模型、探索式分析挖掘数据深层。
+关注继续查看

精通日志查询: 如何翻页获取日志和计算结果

日志服务提供一站式的日志采集、存储、查询、计算功能。交互式的日志采集体验,释放用户的运维压力,解放用户的双手; 交互式的查询分析体验,让用户自由的构建数据模型、探索式分析挖掘数据深层。

image.png

用户使用日志服务的查询分析能力,不仅可以在控制台交互式查询,也可以使用SDK,在程序中使用查询分析。 当计算结果比较大时,怎么把全量结果读取到本地,是一个比较比较头疼的问题。幸好,日志服务提供了翻页的功能,不仅可以翻页读取原始日志内容,也可以把SQL的计算结果翻页读取到本地。开发者可以通过日志服务提供的SDK,或者Cli,通过读数据接口翻页读取日志。

查询和分析使用不同的分页方式

image.png

日志服务提供一个统一的查询日志入口:GetLogstoreLogs,既可以根据关键字查询日志原始内容,也可以提交SQL计算,获取计算结果。

查询翻页使用案例

在GetLogStoreLogs api中,包含offset和lines两个参数

  • offset : 用于指定从第一行开始读取日志
  • lines : 用于指定当前的请求读取多少行,该参数最大100行,如果设置该参数大于100行,则仍然返回100行。

在翻页读取时,不停的增大offset,知道读取到某个offset后,获取的结果行数为0,并且结果的progress为complete状态,则认为读取到了全部数据,可以结束了。

翻页代码样例

翻页的伪代码:

offset = 0                           // 从第0行开始读取
lines = 100                          //每次读取100行
query = "status:200"                 //查询status字段包含200的所有日志
while True:
     response = get_logstore_logs(query, offset, lines) // 执行读取请求
     process (response)                                 //调用自定义逻辑,处理返回的结果
     如果 response.get_count() == 0 && response.is_complete()   
         则读取结束,跳出当前循环
     否则
        offset += 100                           offset增加100,读取下一个100行

python 翻页读取样例

更详细案例参考文档

    endpoint = ''       # 选择与上面步骤创建Project所属区域匹配的Endpoint
    accessKeyId = ''    # 使用您的阿里云访问密钥AccessKeyId
    accessKey = ''      # 使用您的阿里云访问密钥AccessKeySecret
    project = ''        # 上面步骤创建的项目名称
    logstore = ''       # 上面步骤创建的日志库名称
    client = LogClient(endpoint, accessKeyId, accessKey)
    topic = ""
    query = "index"
    From = int(time.time()) - 600
    To = int(time.time())
    log_line = 100
    offset = 0
    while True:
        res4 = None
        for retry_time in range(0, 3):
            req4 = GetLogsRequest(project, logstore, From, To, topic, query, log_line, offset, False)
            res4 = client.get_logs(req4)
            if res4 is not None and res4.is_completed():
                break
            time.sleep(1)
        offset += 100
        if res4.is_completed() && res4.get_count() == 0:
              break;
        if res4 is not None:
            res4.log_print()  # 这里处理结果

Java 翻页读取样例

更详细的案例参考文档

        int log_offset = 0;
        int log_line = 100;//log_line 最大值为100,每次获取100行数据。若需要读取更多数据,请使用offset翻页。offset和lines只对关键字查询有效,若使用SQL查询,则无效。在SQL查询中返回更多数据,请使用limit语法。
        while (true) {
            GetLogsResponse res4 = null;
            // 对于每个 log offset,一次读取 10 行 log,如果读取失败,最多重复读取 3 次。
            for (int retry_time = 0; retry_time < 3; retry_time++) {
                GetLogsRequest req4 = new GetLogsRequest(project, logstore, from, to, topic, query, log_offset,
                        log_line, false);
                res4 = client.GetLogs(req4);
                
                if (res4 != null && res4.IsCompleted()) {
                    break;
                }
                Thread.sleep(200);
            }
            System.out.println("Read log count:" + String.valueOf(res4.GetCount()));
            log_offset += log_line;
            if (res4.IsCompleted() && res4.GetCount() == 0) {
                        break;
            }
            
        }
        

SQL分析结果翻页读取

在SQL分析中,GetLogStoreLogs API 参数中的offset 和lines是无效的,填写。也就是说,如果按照上文翻页读取原始内容的方式,遍历offset翻页,那么每次SQL执行的结果都是一样的。理论上,我们可以在一次调用中,获取全部的计算结果,但是如果结果集太大,可能会产生以下问题:

  • 网络上传输大量数据延时比较高。
  • 客户端的内存要保存大量的结果,供进一步处理。

为了解决SQL翻页的问题,我们提供了标准SQL的limit翻页语法

limit Offset, Line
  • Offset表示从第几行开始读取结果
  • Line表示读取多少行,Line没有大小限制;但是如果一次读取太多,会影响网络延时和客户端的处理。

一个典型案例,假如以下SQL共产生2000条日志

* | select count(1) , url  group by url 

那么可以翻页,每次读取500行,共4次读取完成:

* | select count(1) , url  group by url  limit 0, 500
* | select count(1) , url  group by url  limit 500, 500
* | select count(1) , url  group by url  limit 1000, 500
* | select count(1) , url  group by url  limit 1500, 500

SQL翻页样例

在程序中,SQL翻页的伪代码这样写:

offset = 0                           // 从第0行开始读取
lines = 500                          //每次读取500行
query = "* | select count(1) , url  group by url  limit "                
while True:
     real_query = query + offset + "," +  lines
     response = get_logstore_logs(real_query) // 执行读取请求
     process (response)                                 //调用自定义逻辑,处理返回的结果
     如果 response.get_count() == 0   
         则读取结束,跳出当前循环
     否则
        offset += 500                           offset增加100,读取下一个500行

Python程序样例:

    endpoint = ''       # 选择与上面步骤创建Project所属区域匹配的Endpoint
    accessKeyId = ''    # 使用您的阿里云访问密钥AccessKeyId
    accessKey = ''      # 使用您的阿里云访问密钥AccessKeySecret
    project = ''        # 上面步骤创建的项目名称
    logstore = ''       # 上面步骤创建的日志库名称
    client = LogClient(endpoint, accessKeyId, accessKey)
    topic = ""
    origin_query = "* | select count(1) , url  group by url  limit "
    From = int(time.time()) - 600
    To = int(time.time())
    log_line = 100
    offset = 0
    while True:
        res4 = None
        query = origin_query + str(offset) + " , " + str(log_line)
        for retry_time in range(0, 3):
            req4 = GetLogsRequest(project, logstore, From, To, topic, query)
            res4 = client.get_logs(req4)
            if res4 is not None and res4.is_completed():
                break
            time.sleep(1)
        offset += 100
        if res4.is_completed() && res4.get_count() == 0:
              break;
        if res4 is not None:
            res4.log_print()  # 这里处理结果

Java程序样例:

        int log_offset = 0;
        int log_line = 500;
        String origin_query = "* | select count(1) , url  group by url  limit "
        while (true) {
            GetLogsResponse res4 = null;
            // 对于每个 log offset,一次读取 500 行 log,如果读取失败,最多重复读取 3 次。
            query = origin_query + log_offset + "," + log_line;
            for (int retry_time = 0; retry_time < 3; retry_time++) {
                GetLogsRequest req4 = new GetLogsRequest(project, logstore, from, to, topic, query);
                res4 = client.GetLogs(req4);
                
                if (res4 != null && res4.IsCompleted()) {
                    break;
                }
                Thread.sleep(200);
            }
            System.out.println("Read log count:" + String.valueOf(res4.GetCount()));
            log_offset += log_line;
            if (res4.GetCount() == 0) {
                        break;
            }
            
        }
        

延伸资料

日志服务用户手册,最完整的资料

日志服分析Demo,Nginx日志、CDN日志、DDOS日志、SLB日志Demo,grafana、Datav大屏Demo

5分钟搭建网站实时分析:Grafana+日志服务实战

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何在函数计算中使用结构化的用户日志
目前函数计算默认会将用户的标准输出写入到用户指定的 logstore ,如果使用了 `logger.log()` `console.log()` 这类函数还会带上时间戳及requestID。 通常情况下,对于普通用户来说这已经可以做一些问题调查和调试了。 但在很多情况下,我们可能需要做自定义的特定字段的查询,例如比较数字大小,比较字符串长度,做柱状图、饼图,曲线图等等。本文会介绍如何在函数
1148 0
日志服务与SIEM(如Splunk)集成方案实战
本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规、审计、与其他相关日志能够导入到您的安全运维中心(SOC)中。 注意:相关代码已经正式发布为Splunk采集插件,推荐直接访问下载使用:https://splunkbase.splunk.com/app/4934/
11660 0
OSS实时日志查询——访问记录秒级查询与可视化分析
OSS新发布“OSS访问日志实时查询”,用户可在OSS控制台,对OSS访问日志,进行可视化的实时查询与分析统计。该功能可简化用户对OSS访问记录的审计、统计、事件回溯、运维分析、问题定位等工作,提升运维效率,挖掘日志数据价值,提高基于数据的决策能力,助力业务发展。
2317 0
MySQL查询日志总结
MySQL查询日志介绍     MySQL的查询日志记录了所有MySQL数据库请求的信息。无论这些请求是否得到了正确的执行。默认文件名为hostname.log。默认情况下MySQL查询日志是关闭的。
713 0
Kubernetes 日志查询分析实践
本文将介绍如何基于日志服务实现对 Kubernetes(以下简称 K8s)日志的采集以及查询分析,此外,还附带了对 Ingress、Audit 方案的简要介绍。为了方便大家通过操作来加深理解,本文提供了详细的操作步骤以及对应截图和配置代码。
1985 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4477 0
如何强制删除阿里云日志服务Project
很多其它服务关联创建的日志服务Project,直接在日志服务控制台删除,即使是通过主账户删除,也会提示没有权限。下面提供一种通过CloudShell 强制删除日志服务Project的方法。
970 0
+关注
云雷
日志计算驱动业务增长 让天下没有难分析的日志
103
文章
2
问答
来源圈子
更多
阿里云存储基于飞天盘古2.0分布式存储系统,产品包括对象存储OSS、块存储Block Storage、共享文件存储NAS、表格存储、日志存储与分析、归档存储及混合云存储等,充分满足用户数据存储和迁移上云需求,连续三年跻身全球云存储魔力象限四强。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载