SLS日志服务学习

日志服务

日志服务SLS是云原生观测与分析平台,为Log、Metric、Trace等数据提供大规模、低成本、实时的平台化服务。日志服务一站式提供数据采集、加工、查询与分析、可视化、告警、消费与投递等功能,全面提升您在研发、运维、运营、安全等场景的数字化能力。

什么是日志服务_日志服务-阿里云帮助中心 (aliyun.com)

查询语法

查询语法介绍和相关示例_日志服务-阿里云帮助中心 (aliyun.com)

全文查询:指定关键字和查询规则查询

125.122.104.247 and POST    #包含这俩字段的日志
125.122.104.247 or PUT

字段查询:指定字段名称和字段值查询

remote_addr:125.122.104.247 and status: 200   #查询客户ip和请求状态200

精确查询:使用完整的值查询

remote_addr:125.122  and status: 200       #精确查询,所以无查询结果

模糊查询:* ?不能在查询的开头,不能用在long个double数据;long和double可以用in [1.100]来模糊搜索范围

分析语法

EXCEPT子句的基本语法_日志服务-阿里云帮助中心 (aliyun.com)

创建项目-project

项目(Project)是日志服务的资源管理单元,是进行多用户隔离与访问控制的主要边界。

Project中包含Logstore、MetricStore和机器组等资源,同时也是访问日志服务资源的入口。建议使用不同的Project管理不同的应用、产品或项目中的数据。

  • 组织、管理不同的Logstore或MetricStore。在实际使用中,需要使用日志服务采集及存储不同项目、产品或者环境的日志。可以把不同项目、产品或者环境中的日志分类管理在不同Project中,便于后续的日志消费、导出或者分析。
  • 用于访问控制隔离。您可以为RAM用户授予指定Project的操作权限。
  • 提供日志服务资源的访问入口。日志服务为每个Project配置一个独立的访问入口。该访问入口支持通过网络写入、读取及管理日志。

项目下创建日志库-logstore

日志库(Logstore)是日志服务中日志数据的采集、存储和查询单元。

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

  • 标准型:支持日志服务一站式数据分析功能,适用于实时监控、交互式分析以及构建完整的可观测性系统等场景。
  • 查询型:支持高性能查询,索引流量费用低于标准型,但不支持SQL分析,适用于数据量大、存储周期长(周、月级别以上)、无日志分析的场景。

每个Logstore隶属于一个Project,每个Project中可创建多个Logstore。根据实际需求在目标Project中创建多个Logstore,在执行写入日志、查询和分析日志、加工日志、消费日志、投递日志等操作时,都需要指定Logstore。具体说明如下:

  • 以Logstore为采集单元,采集日志。
  • 以Logstore为存储单元,存储日志以及执行加工、消费、投递等操作。
  • 在Logstore中建立索引,用于查询和分析日志。

日志库下添加logtail配置

1.选择合适的数据接入

2.选择机器组,即需要获取哪个服务器的日志

3.logtail配置,输入服务器中需要解析日志文件的绝对路径和文件名称

4.跟进需要解析日志格式,选择解析模式并输入相关配置

5.提交配置内容,logtail创建成功

此时查看日志库中录入的日志数据,是否是对应服务器日志文件中的数据,解析日志格式是否正确(可以去属性中配置)

日志配置-NGINX配置:
log_format main '[$time_local] [$remote_addr] [$status] …… [$request_time] [$upstream_addr]  [$http_host] [$request_body]';
日志配置-JSON配置

可以尝试通过sql去获取所需的日志内容

eg:

*|SELECT remote_addr ,request_body ,status where request_body like '%error%'

告警分类

性能:
#接口响应速度比上一小时慢了20%以上
#接口平均响应时间是昨日的1.5倍
安全:
#存在恶意注入请求
#有接口可能被爬虫
请求:
#发生大量错误请求
#发生500or503请求
功能:
#xxxxxxxx

创建告警

接口响应速度比上一小时慢了20%以上

检查频率:间隔1h

查询统计-查询区间:1h

*|SELECT compare,request_uri  from ( 
    SELECT compare(AVG_TIME, 3600) as compare,request_uri FROM  (
        SELECT avg(request_time) AS AVG_TIME,request_uri FROM log group by request_uri 
    )group by request_uri 
) where compare[3] > 1.2

#SELECT avg(request_time) AS AVG_TIME,request_uri FROM log group by request_uri
#先获取当前时间周期内每个请求的平均请求时间
#SELECT compare(AVG_TIME, 3600) as compare,request_uri FROM
#compare(x,n) 对比当前时间周期内的结果x,与n秒前时间周期内容的结果
#对比当前平均请求时间和1h前的平均请求时间
#[0.17618765432098774,0.13491338582677168,1.3059316037565916]   /presale/buffet
#*|SELECT compare,request_uri  where compare[3] > 1.2
#找到compare中的第三个值的大于1.2的数据

在这里插入图片描述

原因分析:request_time是text类型,不能用avg方法

解决方案:修改类型为double

接口平均响应时间是昨日的1.5倍

检查频率:每天12:00

查询统计-查询区间:一天整点时间

(*)| SELECT uri as "请求",avg_time[1] as "今日平均",avg_time[2] as "昨日平均" FROM (SELECT
  uri,
  compare(avg_time, 86400) as avg_time
FROM  (
    SELECT
      regexp_replace(split_part(verb, '?', 1), '\d+','') as uri,
      AVG(request_time) AS avg_time,count(*) as count
    FROM log
    GROUP BY
      uri HAVING count > 30
  ) 
GROUP BY
  uri HAVING avg_time[3] > 1.5) 
#split_part(x, delimeter, part) 使用指定delimeter分割字符串x并返回第一个子串
#regexp_replace(x, regular expression, replace string)   替换目标字符串中的符合正则表达式的子串返回被替换后的字符串
#SELECT uri,avg_time,count FROM log GROUP BY uri HAVING count > 30
#找出请求次数超过30次的请求,并计算平均响应时间
#compare(avg_time, 86400)   一天前
#求哪个uri对应的平均响应时间和一天前比,提高了1.5倍

存在恶意注入请求

*| select  from log where request_body like '%SELECT%'or request_body like '%union%' 

SQL注入日志可能存在字段:select、union、数据库的表名

XSS注入日志可能存在字段:script、alert

有接口可能被爬虫

(*)| SELECT uri as "请求",time[1] as "当前小时次数",time[2] as "上一小时次数" FROM (SELECT
  uri,
  compare(time, 3600) as time
FROM  (
    SELECT
      regexp_replace(split_part(verb, '?', 1), '\d+','') as uri,
      count(*) AS time
    FROM log
    GROUP BY
      uri
  ) 
GROUP BY
  uri HAVING time[3] > 100 and time[1] > 1000) 
#SELECT  uri, time FROM log GROUP BY verb
#uri和对应的次数
#compare(time, 3600)   上一小时和当前一小时的次数求比值
#此时获取到的是uri和对应的本小时,上小时次数及比值

发生大量错误请求

触发条件:当数量>10-高;当数量>100-严重

*| SELECT status,request_time, verb as "请求",time_local as "发生时间",request_body as "body参数" where status > 400

发生500请求

*| SELECT verb as "请求",time_local as "发生时间",request_body as "body参数" where status = 500
  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值