CLS的探寻:Python怎么让日志免费云化

日志服务项目(Cloud Log Service,CLS)是腾讯云服务给予的一站式日志综合服务平台,给予了从日志收集、日志储存到日志查找,数据分析图表、监管报警、日志递送等多种服务项目,帮助客户根据日志来处理业务流程运维管理、服务项目监管、日志财务审计等情景难题。

序言

日志服务项目(Cloud Log Service,CLS)是腾讯云服务给予的一站式日志综合服务平台,给予了从日志收集、日志储存到日志查找,数据分析图表、监管报警、日志递送等多种服务项目,帮助客户根据日志来处理业务流程运维管理、服务项目监管、日志财务审计等情景难题。

简而言之便是CLS给予了日志的云化储存,并给予了查看、剖析、监管,报警等作用。因此 今日就怀着好奇心的心,来探寻一下应用python如何把该设备日志载入到CLS上。

自然环境配备

官方网文本文档给予了详尽的应用流程应用流程,文本文档连接以下:https://cloud.tencent.com/document/product/614/34340

1. 开通服务

点一下https://cloud.tencent.com/product/cls进入页面,能够点一下马上应用启用服务项目;

自然还可以点一下主题活动公示来查询完全免费的应用信用额度:

能够看得出,完全免费信用额度总流量信用额度是5GB/日,主题活动截至于2021年底。

启用服务项目后,进到clk服务项目网页页面。能够见到,给予了多种多样日志的连接计划方案。

2. 建立日志集和日志主题风格

日志集(Logset)是日志服务项目的项目风险管理模块,用以区别不一样新项目的日志。日志主题风格(Topic)是日志服务项目的基本上管理方法模块,用于储存日志文档。一个日志集能够包括好几个日志主题风格。

点一下https://console.cloud.tencent.com/cls/overviewCLS配备网页页面。

点一下侧边栏日志主题风格 ,点一下建立日志主题风格

可能是文本文档过旧,官方网文本文档写的是先要建立日志集,可是没找到这一按键。实际上在第一次建立时主题风格时键入一个日志集,便会全自动建立。

建立好的日志主题风格以下,这儿必须的是主题风格ID,认为载入时根据ID来将日志提到这一topic。

3. 建立设备组

CLS应用设备组来统一管理方法一组日志源设备。。另外因为我了解成授权管理,仅有这种设备能浏览CLS服务项目。

Python日志载入CLS

在一开始CLS的概述网页页面,能够见到CLS给予了多种多样迅速连接计划方案,许多 必须安裝Loglistener来收集日志,这儿应用Python运用API载入连接计划方案来将日志载入,不用安裝。

点一下每一种连接计划方案都是会进到相对应的开发文本,这儿我点一下API载入进到开发文本。

官方网给予了API载入标准:

POST /structuredlog?topic_id=xxxxxxxx-xxxx-xxxx-xxxx HTTP/1.1
Host: <Region>.cls.tencentyun.com
Authorization: <AuthorizationString>
Content-Type: application/x-protobuf
x-cls-compress-type:lz4

<LogGroupList 的 PB 文件格式装包內容>

从上边能够看得出有两个主要参数,一个是topic_id,即日志主题风格id;一个是LogGroupList,即日志传输协议內容。这儿PB指的是应用protobuf开展实例化,因此 务必先安裝protobuf。

安裝protobuf

protobuf是一种二进制的实例化文件格式,相对性于json而言容积更小,传送更快。安裝protobuf的目地关键用于将proto文档编写出python、c、Java可启用的插口。

# 假如gcc版本号较低,必须升級gcc
wget https://main.qcloudimg.com/raw/d7810aaf8b3073fbbc9d4049c21532aa/protobuf-2.6.1.tar.gz
tar -zxvf protobuf-2.6.1.tar.gz -C /usr/local/ && cd /usr/local/protobuf-2.6.1
./configure 
make && make install
# 能够在/etc/profile或是~/.bash_profile结尾设定永久性合理
export PATH=$PATH:/usr/local/protobuf-2.6.1/bin

应用下边指令查询是不是安裝取得成功。

protoc --version

搭建python可启用的PB

建立cls.proto文档,界定实例化构造:

package cls;

message Log
{
    message Content
    {
        required string key   = 1; // 每一组字段名的 key
        required string value = 2; // 每一组字段名的 value
    }
    required int64   time     = 1; // 时间格式,UNIX时间格式
    repeated Content contents = 2; // 一条日志里的好几个kv组成
}

message LogTag
{
    required string key       = 1;
    required string value     = 2;
}

message LogGroup
{
    repeated Log    logs        = 1; // 好几条日志生成的日志二维数组
    optional string contextFlow = 2; // 现阶段暂未效应
    optional string filename    = 3; // 日志文件夹名称
    optional string source      = 4; // 日志来源于,一般应用设备IP
    repeated LogTag logTags     = 5;
}

message LogGroupList
{
    repeated LogGroup logGroupList = 1; // 日志组目录
}

仅用下边指令将proto文件格式转换为python可启用的插口。

protoc cls.proto --python_out=./

实行完后,在这里文件目录下转化成cls_pb2.py

python编码开发设计

编码的开发设计关键分成三个一部分:Protobuf构造结构、Authorization数据加密结构和要求提交日志。前2个一部分关键点过多,尤其是Authorization结构涉及到sha1加密、hmac-sha1签字及其四个数据加密主要参数的结构。:

1. Protobuf构造结构

import cls_pb2 as cls
import time
import requests
from hashlib import sha1
import hmac

# 搭建protoBuf日志內容
LogLogGroupList = cls.LogGroupList()

LogGroup = LogLogGroupList.logGroupList.add()
LogGroup.contextFlow = "1"
LogGroup.filename = "python.log"
LogGroup.source = "localhost"

LogTag = LogGroup.logTags.add()
LogTag.key = "key"
LogTag.value = "value"

Log = LogGroup.logs.add()
Log.time = int(round(time.time() * 1000000))

Content = Log.contents.add()
Content.key = "Hello"
Content.value = "World"
print(LogLogGroupList)
# 实例化
LogLogGroupList = LogLogGroupList.SerializeToString()

2. Authorization数据加密结构

查询文本文档:https://cloud.tencent.com/document/product/614/12445,里边有详尽的主要参数转化成流程和示例。

这一部分的编码开发设计肯定磨练本人的细心和仔细,合适在夜深人静自身搞。

# 公共性主要参数一部分
secretId = '换成你的secretId'
secretKey = '换成你的secretKey'
region = 'ap-nanjing'
host = f'{region}.cls.tencentyun.com'
start = int(time.time())
end = start   1000
uri = 'structuredlog'
method = 'post'
params = 'topic'

# 搭建HttpRequestInfo
HttpRequestInfo = f'{method}\n'   f'/{uri}\n'   '\n\n'
sha1_info = sha1()
sha1_info.update(HttpRequestInfo.encode('utf-8'))
print(sha1_info.hexdigest())

# 依据HttpRequestInfo搭建StringToSign
StringToSign = 'sha1\n'   f'{start};{end}\n'   sha1_info.hexdigest()   '\n'
key = secretKey.encode('utf-8')
value = f'{start};{end}'.encode('utf-8')
SignKey = hmac.new(key, value, 'sha1')
print(SignKey.hexdigest())

# 依据StringToSign搭建Signature
key = SignKey.hexdigest().encode('utf-8')
value = StringToSign.encode('utf-8')
Signature = hmac.new(key, value, 'sha1').hexdigest()
print(Signature)

# 搭建Authorization
Authorization = f'q-sign-algorithm=sha1&q-ak={secretId}&q-sign-time={start};{end}&q-key-time={start};{end}&q-header-list=&q-url-param-list=&q-signature={Signature}'

这一块是要我觉得较难的,里边的坑过多,一个主要参数套一个主要参数,非常容易令人恍恍惚惚,因此 绝大多数時间都花在了检测主要参数转化成这一部分。

如图所示,一直提醒我签字计算误差,缘故汇总以下:1.主要参数拼凑不对;2.hmac的kv放反。

原本因为我在要求头内加上了lz4压缩格式,可是运作发觉编码中未完成lz4的缩小,因此 报了下列不正确。

最终放弃了lz4请求头,缩小作用都没有完成。有兴趣爱好的能够搞一下。

3. 提交日志

实际上便是结构一个post要求,将日志编码序列化为protobuf文件格式上传入网络服务器。

# 进行要求
url = f'https://{host}/{uri}?topic_id=717eba7d-85bb-4cd5-9c68-dfaa9f672bc6'
headers = {'Authorization': Authorization, 'Host': host, 'Content-Type': 'application/x-protobuf'}
response = requests.post(url, headers=headers, data=LogLogGroupList)
print(response.status_code, response.text)
print(LogLogGroupList)

运作检测

python3运作程序流程:

运行结果

打印出了日志的protobuf构造信息内容、二进制数据信息,及其数据加密主要参数和要求状态码。

然后进到CLS网页页面查询,日志早已载入。

总结

跟随文本文档从学习培训CLS、python开发设计到搜集素材图片、梳理成文章内容类似用了五、六个钟头,下班了就在搞,提到这的情况下早已凌晨一点了,原本还想要Java写一版,可是确实是肝没动了。

期待本文可以协助你掌握CLS,希望下一次相遇。


评论(0条)

刀客源码 游客评论