云服务扫盲笔记(2) —— SLS 接入与设置自动化

       前篇我们学习了SLS的核心用途及概念,本篇以将一个linux服务器的json格式日志接入阿里云SLS为例,继续学习SLS接入中的关键设置及注意事项,以及如何将其实现简单自动化快速操作。

一、 SLS 日志接入流程

[1] 准备工作(确定日志路径和格式等)↓
[2] 在 Linux 服务器安装 Logtail 客户端↓
[3] 创建 SLS Project[4] 创建 Logstore↓
[5] 创建机器组↓
[6] 创建采集配置(Logtail Config 或 Pipeline)↓
[7] 机器组绑定↓
[8] 开启索引↓
[9] 在 SLS 控制台验证日志数据↓
[10] 授权用户访问/读写↓
[11] 日志投递/冷热分层(可选)
  • 其中1和2主要为用户操作,本篇不会涉及,详细可以参考阿里云官方文档
  • 后续代码按照流程节点将其拆分出了单独脚本,如有需要完全可以进行合并

二、 创建 SLS Project

       这步关键点是名字,project名字创建后不能修改,只能删除重建。如果等一切都接完了发现project名字不合规范,那真是无语了。

       另外注意删除project后默认会在回收站放7天,虽说在回收站中,阿里云还是会将其部分设置视为已生效。例如配置了多个project中的logtail接入相同日志文件,即使旧project已经在回收站,也会报配置冲突。

from aliyun.log import LogClient
import os# 本示例从环境变量中获取AccessKey ID和AccessKey Secret。
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key_secret = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')# 日志服务的服务接入点
endpoint = "cn-shenzhen.log.aliyuncs.com"
# 创建日志服务Client。
client = LogClient(endpoint, access_key_id, access_key_secret)# Project名称。
project_name = "slsproject-1"# Project描述。project_des=""代表描述值为空
project_des = "your describe"# 调用create_project接口,如果没有抛出异常,则说明执行成功。
def main():try:res = client.create_project(project_name, project_des)res.log_print()res = client.get_project(project_name)res.log_print()except Exception as error:print(error)if __name__ == '__main__':main()

三、 创建 Logstore

这步关键点:

  • 保留时间 ttl:热日志保留时间,与费用相关。例如设置为15,若不配置日志投递及冷热分层,则15天前的日志将无法从SLS中查询
  • webtracking:控制是否允许 通过 HTTP/HTTPS API 直接向 Logstore 写日志。如果开启,你无需安装 Logtail、Flume、Beats 等采集程序,客户端(例如浏览器 JS、手机 App、小程序、第三方后端)就可以 直接调用 SLS API 发送日志数据到这个 Logstore

看起来 webtracking 似乎更简单,为什么阿里云不将其作为默认方式?

创建代码

from aliyun.log import LogClient, LogException
import os# 本示例从环境变量中获取AccessKey ID和AccessKey Secret
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key_secret = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')# 日志服务的服务接入点
endpoint = "cn-shenzhen.log.aliyuncs.com"client = LogClient(endpoint, access_key_id, access_key_secret)# Project名称
project_name = 'sls-project'# 待创建 logstore 列表
logstore_names = ['a-http-vm', 'b-http-vm', 'c-http-vm', 'd-http-vm']ttl=15
shard_count=2
append_meta=True
enable_tracking=Falsedef main():for logstore_name in logstore_names:print(f'正在创建 logstore: {logstore_name}')try:res = client.create_logstore(project_name, logstore_name, ttl=ttl, shard_count=shard_count,enable_tracking=enable_tracking, append_meta=append_meta)print(f'成功创建 logstore: {logstore_name}')except LogException as e:if e.get_error_code() == 'LogStoreAlreadyExist':print(f'logstore 已存在: {logstore_name}')else:print(f'创建 logstore 失败: {logstore_name}, 错误: {e}')if __name__ == '__main__':main()

四、 创建机器组

顾名思义,要从哪些机器采集日志数据

from aliyun.log import LogClient, MachineGroupDetail
import os# 本示例从环境变量中获取AccessKey ID和AccessKey Secret
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key_secret = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
# 日志服务的服务接入点
endpoint = "cn-shenzhen.log.aliyuncs.com"# 实例化LogClient类
client = LogClient(endpoint, access_key_id, access_key_secret)project_name = "sls-project"# 组名和IP列表
group_names = ["a-http-vm","b-http-vm","c-http-vm","d-http-vm"
]
machine_ips = ["192.168.1.126","192.168.1.127","192.168.1.128","192.168.1.129"
]def main():client = LogClient(endpoint, access_key_id, access_key_secret)for group_name, ip in zip(group_names, machine_ips):machine_type = "ip"machine_list = [ip]  # 每组对应一个IPgroup_detail = MachineGroupDetail(group_name, machine_type, machine_list)try:res = client.create_machine_group(project_name, group_detail)print(f'创建机器组 {group_name} 成功,IP: {ip}')res.log_print()except Exception as e:print(f'创建机器组 {group_name} 失败,IP: {ip}。错误:{e}')if __name__ == '__main__':main()

五、 创建采集配置 & 机器组绑定

相对来说这步是参数最多最复杂的,核心参数设置如下

代码如下

from aliyun.log import LogClient
from aliyun.log.logtail_config_detail import SimpleFileConfigDetail
import os# 本示例从环境变量中获取AccessKey ID和AccessKey Secret
access_key_id = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
access_key_secret = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')# 日志服务的服务接入点
endpoint = "cn-shenzhen.log.aliyuncs.com"client = LogClient(endpoint, access_key_id, access_key_secret)project = "sls-project"
# 数据源:一一对应
logstore_names = ["a-http-vm","b-http-vm","c-http-vm","d-http-vm"
]
group_names = ["a-http-vm","b-http-vm","c-http-vm","d-http-vm"
]
logs = ["/var/log/nginx/logstash_access.log","/var/log/nginx/logstash_access.log","/var/log/nginx/logstash_access.log","/var/lib/gerrit/logs/httpd_log.json"
]# 公共配置
timeFormat = ''
timeKey = ''
localStorage = True
enableRawLog = False
topicFormat = 'none'
fileEncoding = 'utf8'
maxDepth = 0
preserve = True
preserveDepth = 0
filterKey = []
filterRegex = []
adjustTimezone = False
delayAlarmBytes = 0
delaySkipBytes = 0
discardNonUtf8 = False
discardUnmatch = False
dockerFile = False
logBeginRegex = '.*'
logTimezone = ''
logType = 'json_log'
maxSendRate = -1
mergeType = 'topic'
priority = 0
sendRateExpire = 0
sensitive_keys = []
tailExisted = Falsedef main():for logstore, group, logfile in zip(logstore_names, group_names, logs):logPath = os.path.dirname(logfile)      # 获取目录前缀filePattern = os.path.basename(logfile) # 获取日志文件名configName = logstore                   # 这里用 logstore 作为配置名try:config_detail = SimpleFileConfigDetail(logstoreName=logstore,configName=configName,logPath=logPath,filePattern=filePattern,timeFormat=timeFormat,timeKey=timeKey,localStorage=localStorage,enableRawLog=enableRawLog,topicFormat=topicFormat,fileEncoding=fileEncoding,maxDepth=maxDepth,preserve=preserve,preserveDepth=preserveDepth,filterKey=filterKey,filterRegex=filterRegex,adjustTimezone=adjustTimezone,delayAlarmBytes=delayAlarmBytes,delaySkipBytes=delaySkipBytes,discardNonUtf8=discardNonUtf8,discardUnmatch=discardUnmatch,dockerFile=dockerFile,logBeginRegex=logBeginRegex,logTimezone=logTimezone,logType=logType,maxSendRate=maxSendRate,mergeType=mergeType,priority=priority,sendRateExpire=sendRateExpire,sensitive_keys=sensitive_keys,tailExisted=tailExisted)# 创建 logtail 配置print(f"创建 Logtail 配置: {configName}, 日志路径: {logPath}, 文件: {filePattern}")res = client.create_logtail_config(project, config_detail)res.log_print()# 绑定到机器组print(f"绑定日志采集配置 {configName} 到机器组 {group}")res = client.apply_config_to_machine_group(project, configName, group)res.log_print()# 查询配置res = client.get_logtail_config(project, configName)res.log_print()print("="*80)except Exception as e:print(f"[错误] 创建 {configName} 失败: {e}")if __name__ == '__main__':main()

六、 开启索引

如果要在查看和分析日志,必须先开启索引

       这块虽然也可以用代码实现,但接口目前无“自动生成索引”功能,需要自行分析日志结构并写入代码处理。如果是大批量标准化的日志,这块可以实现,如果非标,直接点击界面效率更高。

开启后等两分钟,若接入正常,应该可以看到日志

七、 授权用户访问/读写

这里一般按project或logstore授权

1. 只读权限

{"Version": "1","Statement": [{"Effect": "Allow","Action": ["log:ListProjects","log:GetAcceleration","log:ListDomains","log:GetLogging","log:ListTagResources"],"Resource": "acs:log:*:*:project/*"},{"Effect": "Allow","Action": "log:GetProject","Resource": "acs:log:*:*:project/sls-project"},{"Effect": "Allow","Action": "log:ListLogStores","Resource": "acs:log:*:*:project/sls-project/logstore/*"},{"Effect": "Allow","Action": ["log:GetLogStore","log:GetLogStoreHistogram","log:GetIndex","log:ListShards","log:GetLogStoreContextLogs","log:GetLogStoreLogs","log:GetCursorOrData"],"Resource": "acs:log:*:*:project/sls-project/logstore/a-http-vm"},{"Effect": "Allow","Action": "log:*SavedSearch","Resource": "acs:log:*:*:project/sls-project/*"},{"Effect": "Allow","Action": "log:*","Resource": "acs:log:*:*:project/sls-project/dashboard/*"}]
}

2. 读写权限

{"Version": "1","Statement": [{"Effect": "Allow","Action": "log:*","Resource": ["acs:log:*:*:project/sls-project/logstore/a-http-vm","acs:log:*:*:project/sls-project/logstore/a-http-vm/*"]},{"Effect": "Allow","Action": "log:ListProject","Resource": "*"}]
}

八、 日志投递/冷热分层

1. 数据流转方式

2. 相似及区别

参考

创建Project_日志服务(SLS)-阿里云帮助中心

管理日志项目Project_日志服务(SLS)-阿里云帮助中心

GPT 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96233.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LwIP入门实战 — 6 LwIP 网络数据包

目录 6.1 pbuf结构体 6.2 pbuf 的类型 6.2.1 PBUF_RAM 类型的pbuf 6.2.2 PBUF_POOL 类型的pbuf 6.2.3 PBUF_ROM 和 PBUF_REF 类型pbuf 6.3 pbuf 6.3.1 pbuf_alloc() 6.3.2 pbuf_free() 6.4 其它pbuf 操作函数 6.5 网卡中使用的 pbuf 6.5.1 low_level_output() 6.5.…

【已解决】Linux中程序脚本可以手动执行成功,但加在rc.local中不能开机自启

之前开发遇到的一个问题:在Linux中,明明程序脚本可以手动执行成功,但加到开机自启动里,却会失败,属实让人摸不着头脑。 问题排查: 有以下几种可能: 自启动脚本,执行权限不足或者脚本…

切块、清洗、烹饪:RAG知识库构建的三步曲

嘿,各位AI技术爱好者们,你是不是经常遇到这样的情况:辛辛苦苦训练的AI助手,面对专业问题时却"一问三不知"或者"胡言乱语"?明明你已经喂了它一堆PDF和Word文档,为啥它就是不会用&#x…

ubuntu 安装 docker 详细步骤

登录,ubuntu版本 22.04 wqbboy192.168.1.2s password: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/…

AndroidWorld+mobileRL

1、Android地址 https://github.com/google-research/android_world/tree/main?tabreadme-ov-file#installation 这里有排行榜,提交方式为手工提交到共享表格 https://docs.google.com/spreadsheets/d/1cchzP9dlTZ3WXQTfYNhh3avxoLipqHN75v1Tb86uhHo/edit?gid0#g…

《练手:ipv4地址计算和Telnet 远程设备管理配置实验文档》

实验一:IPv4 地址网段判断原理及实例 判断两个 IPv4 地址是否处于同一网段,核心依据是:将两个 IP 地址分别与子网掩码进行AND 运算后,得到的网络地址是否相同。若相同,则属于同一网段;反之则不属于。 实验拓…

小程序获取手机号完整流程 弹出框获取电话号码

小程序获取手机号完整流程 弹出框获取电话号码 1️⃣ 前提条件 - 使用微信小程序 - 小程序已注册并通过审核 - 后端可存储 session_key2️⃣ 小程序端按钮 <button type"default" open-type"getPhoneNumber" getphonenumber"decryptPhoneNumber&qu…

Nginx 实战系列(四)—— Nginx反向代理与负载均衡实战指南

文章目录前言一、反向代理1.1 反向代理原理1.2 实验配置示例二、负载均衡2.1 负载均衡基本原理2.2 常见负载均衡策略2.2.1 轮询&#xff08;Round Robin&#xff09;&#xff08;最常用&#xff09;2.2.2 最少连接数&#xff08;Least Connections&#xff09;2.2.3 IP 哈希&am…

深度学习(一):人工智能、机器学习与深度学习

人工智能 (AI)&#xff1a;宏大的目标 人工智能是最广泛、最宏大的概念&#xff0c;它的目标是让机器能够模仿人类的智能行为&#xff0c;例如&#xff1a; 推理&#xff1a;像下棋程序一样&#xff0c;通过逻辑来做决策。规划&#xff1a;为实现一个目标而制定步骤&#xff0c…

[网络入侵AI检测] 纯卷积神经网络(CNN)模型 | CNN处理数据

第5章&#xff1a;纯卷积神经网络&#xff08;CNN&#xff09;模型 欢迎回来 在第1章&#xff1a;分类任务配置&#xff08;二分类 vs. 多分类&#xff09;中&#xff0c;我们学习了如何提出正确的问题&#xff1b; 在第2章&#xff1a;数据加载与预处理中&#xff0c;我们准…

Unity AssetBundle详解

简介 AssetBundle&#xff08;简称&#xff1a;AB包&#xff09; 是 Unity 提供的一种资源压缩包&#xff0c;用于在应用运行时动态地加载和卸载资源。它可以将非代码资源&#xff08;如模型、纹理、预制体、音频、甚至整个场景&#xff09;打包成一个或多个文件&#xff0c;这…

golang-gin包

文章目录一、了解gin二、html渲染三、gin中get/post获取值四、路由分组五、中间件六、文件上传七、gin中的cookie一、了解gin Gin 是一个用 Golang编写的 高性能的web 框架, 由于http路由的优化&#xff0c;速度提高了近 40 倍。 Gin的特 点就是封装优雅、API友好。 特性类别…

基于脚手架微服务的视频点播系统-界面布局部分(二):用户界面及系统管理界面布局

基于脚手架微服务的视频点播系统-界面布局部分:二.首页及播放界面布局一.用户界面布局1.1用户界面布局分析与实现1.2更新用户图像按钮及逻辑1.3修改按钮及逻辑1.4上传视频对话框实现逻辑1.4.1页面跳转逻辑处理1.4.2页面控件响应处理二.系统界面布局2.1系统管理页框架2.2审核管理…

STL库——二叉搜索树

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言&#xff1b; 文章目录 前言 一、二叉搜索树的概念 二、二叉搜索树的性能分析 三、二叉搜索树的插入 四、二叉搜索树的查…

【Linux】线程概念与控制

一. 线程的概念1.什么是线程线程是进程内部的一个执行流&#xff0c;是进程调度的基本单位。它具有轻量的特点&#xff0c;它的创建和销毁所消耗的资源更少&#xff0c;线程间切换比进程间切换消耗的资源更少&#xff1b;它与进程共享一张虚拟地址空间表&#xff0c;通过进程来…

双轴倾角传感器厂家与物联网角度传感器应用全解析

本文主要探讨双轴倾角传感器厂家的核心技术优势&#xff0c;以及物联网角度传感器在智能监测中的创新应用。同时&#xff0c;也详细介绍了水平监测传感器厂家的解决方案特点&#xff0c;并分析了专业进口倾角传感器代理所提供的原厂品质保障与本地化服务支持。以深圳瑞惯科技有…

容器-资源隔离机制

一. 引言&#xff1a; 大家都知道&#xff0c;在一台机器上&#xff0c;可以运行任意(根据系统资源)个容器实例。且各容器间是相互独立&#xff0c;不做任何关联的。那么&#xff0c;docker是通过什么方式来实现容器隔离的呢&#xff1f; 接下来我们了解下。 二. 关于容器隔离…

Agentic RL Survey: 从被动生成到自主决策

Agentic RL Survey: 从被动生成到自主决策 本文将系统解读《The Landscape of Agentic Reinforcement Learning for LLMs: A Survey》这篇综述。该综述首次将智能体强化学习&#xff08;Agentic RL&#xff09;与传统LLM-RL范式正式区分&#xff0c;通过MDP/POMDP理论框架梳理…

彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声

在 VMware 虚拟机中安装的 CentOS 7.9 系统&#xff0c;即使通过修改 /etc/inputrc 禁用了终端铃声&#xff08;set bell-style none&#xff09;&#xff0c;vi 或 vim 编辑时仍可能发出滴滴声。这是因为 vi/vim 有自己独立的铃声控制机制。以下是解决方法&#xff1a;方法 1&…

基于A2A和ADK的内容规划代理

项目概述 Content Planner Agent 是一个基于 Google Agent Development Kit (ADK) 和 Python A2A SDK 构建的智能内容规划代理。该代理能够根据高层次的内容描述&#xff0c;创建详细的内容大纲。 什么是A2A Protocol A2A Protocol&#xff08;Agent2Agent 协议&#xff09;…