云服務掃盲筆記(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
英文地址,請注明出處:http://en.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;…