常见资源管理
本文介绍常用的日志服务资源管理代码操作示例。
前提条件
已创建RAM用户并完成授权。具体操作,请参见创建RAM用户并完成授权。
已配置环境变量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。具体操作,请参见配置环境变量。
重要阿里云账号的AccessKey拥有所有API的访问权限,建议您使用RAM用户的AccessKey进行API访问或日常运维。
强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
示例1:初始化日志服务Client
LogClient是日志服务的Python客户端,用于管理Project、Logstore等日志服务资源。使用Python SDK发起日志服务请求,您需要初始化一个Client实例。示例代码如下所示:
# Setup basic client
from aliyun.log.logclient import LogClient
import os
# 日志服务的服务入口。
endpoint = "cn-huhehaote.log.aliyuncs.com"
# 本示例从环境变量中获取AccessKey ID和AccessKey Secret。
accessId = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID', '')
accessKey = os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET', '')
client = LogClient(endpoint, accessId, accessKey)
示例2:写入日志数据
示例代码如下:
# Write Log to Logstore
import time
from aliyun.log.logitem import LogItem
from aliyun.log.putlogsrequest import PutLogsRequest
project = "YOUR_SLS_PROJECT"
logstore = "YOUR_SLS_LOGSTORE"
one_log_contents = []
one_log_contents.append(("msg1", "Hello")) # log key value in one logitem
one_log_contents.append(("msg2", "World"))
one_log = LogItem(
timestamp=int(time.time()),
contents=one_log_contents,
)
logs = [one_log]
putReq = PutLogsRequest(
project=project,
logstore=logstore,
logitems=logs,
)
res = client.put_logs(putReq)
print(res.get_body())
示例3:查询日志
示例代码如下:
# Query SLS Logstore
import time
project = "YOUR_SLS_PROJECT"
logstore = "YOUR_SLS_LOGSTORE"
etime = int(time.time())
stime = etime - 3600
query = '*'
datas = []
for i in client.get_log_all(project, logstore, stime, etime, query=query):
for log in i.logs:
datas.append(log.get_contents())
print(datas)
可视化展示查询日志,代码示例如下:
# Query SLS Logstore to Pandas
import time
import pandas as pd
project = "YOUR_SLS_PROJECT"
logstore = "YOUR_SLS_LOGSTORE"
etime = int(time.time())
stime = etime - 3600
query = '* | select msg1 from log'
datas = []
for i in client.get_log_all(project, logstore, stime, etime, query=query):
for log in i.logs:
datas.append(log.get_contents())
# Convert datas to pandas dataframe
df_ret = pd.DataFrame(datas)
print(df_ret)
示例4:查询Project列表
示例代码如下:
# List SLS Project
ret = client.list_project()
ret.get_projects()
示例5:查询Logstore列表
示例代码如下:
# List SLS Logstore
project = "YOUR_SLS_PROJECT"
ret = client.list_logstore(project)
print(ret.get_logstores())
示例6:创建Logstore
示例代码如下:
project = "YOUR_SLS_PROJECT"
logstore = "YOUR_SLS_LOGSTORE"
ret = client.create_logstore(project, logstore)
ret.log_print()
示例7:创建或更新Logstore索引配置
示例代码如下:
# Create or Update SLS Logstore Index
from aliyun.log.logexception import LogException
from aliyun.log.index_config import IndexConfig
project = "YOUR_SLS_PROJECT"
logstore = "YOUR_SLS_LOGSTORE"
request_json = {
'index_mode': 'v2',
'line': {
'caseSensitive': False,
'chn': False,
'token': [',',' ',"'",'"',';','=','(',')','[',']','{','}','?','@','&','<','>','/',':','\n','\t','\r']
},
'log_reduce': False,
}
req = IndexConfig()
req.from_json(request_json)
try:
client.get_index_config(project_b, logstore_b)
# update index config if index config is already exists
ret = client.update_index(project_b, logstore_b, req)
except LogException as ex:
if ex.get_error_code() in ("IndexConfigNotExist"):
# create index if index not exists
ret = client.create_index(project_b, logstore_b, req)
ret.log_print()
创建或更新Logstore列索引,代码示例如下:
# Create or Update SLS Logstore Index With Column Index
from aliyun.log.logexception import LogException
from aliyun.log.index_config import IndexConfig
project = "YOUR_SLS_PROJECT"
logstore = "YOUR_SLS_LOGSTORE"
request_json = {
'index_mode': 'v2',
'line': {
'caseSensitive': False,
'chn': False,
'token': [',',' ',"'",'"',';','=','(',')','[',']','{','}','?','@','&','<','>','/',':','\n','\t','\r']
},
'log_reduce': False,
'keys' : {
"msg1" : {
"type": "text",
'token': [',',' ',"'",'"',';','=','(',')','[',']','{','}','?','@','&','<','>','/',':','\n','\t','\r'],
"doc_value": True
},
"long_column" : {
"type": "long",
"doc_value": True
},
"double_column" : {
"type": "double",
"doc_value": True
},
"json_column" : {
"type": "json",
'token': [',',' ',"'",'"',';','=','(',')','[',']','{','}','?','@','&','<','>','/',':','\n','\t','\r'],
"doc_value": True,
'json_keys': {
"key1" : {
"type": "text",
'token': [',',' ',"'",'"',';','=','(',')','[',']','{','}','?','@','&','<','>','/',':','\n','\t','\r'],
"doc_value": True
}
}
},
}
}
req = IndexConfig()
req.from_json(request_json)
try:
client.get_index_config(project_b, logstore_b)
# update index config if index config is already exists
ret = client.update_index(project_b, logstore_b, req)
except LogException as ex:
if ex.get_error_code() in ("IndexConfigNotExist"):
# create index if index not exists
ret = client.create_index(project_b, logstore_b, req)
ret.log_print()
示例8:跨Logstore复制索引配置
示例代码如下:
# Copy SLS Logstore A's index config to Logstore B
from aliyun.log.logexception import LogException
from aliyun.log.index_config import IndexConfig
project_a = "YOUR_SLS_PROJECT_A"
logstore_a = "YOUR_SLS_LOGSTORE_A"
project_a = "YOUR_SLS_PROJECT_B"
logstore_a = "YOUR_SLS_LOGSTORE_B"
ret = client.get_index_config(project_a, logstore_a)
req = IndexConfig()
req.from_json(ret.get_body())
try:
client.get_index_config(project_b, logstore_b)
# update index config if index config is already exists
ret = client.update_index(project_b, logstore_b, req)
except LogException as ex:
if ex.get_error_code() in ("IndexConfigNotExist"):
# create index if index not exists
ret = client.create_index(project_b, logstore_b, req)
示例9:跨Project复制Logtail配置
示例代码如下:
# Copy logtail configs between projects
project_a = "YOUR_SLS_PROJECT_A"
project_b = "YOUR_SLS_PROJECT_B"
logtail_config_name = "YOUR_LOGTAIL_CONFIG_NAME"
ret = client.get_logtail_config(project_a, logtail_config)
ret = client.create_logtail_config(project_b, ret.logtail_config)
ret.log_print()
示例10:跨Project复制Dashboard配置
示例代码如下:
# Copy dashboard between projects
project_a = "YOUR_SLS_PROJECT_A"
project_b = "YOUR_SLS_PROJECT_B"
dashboard_name = "YOUR_DASHBOARD_NAME"
ret = client.get_dashboard(project_a, dashboard_name)
ret = client.create_dashboard(project_b, ret.get_body())
ret.log_print()
示例11:跨Project复制告警配置
示例代码如下:
# Copy alert between projects
project_a = "YOUR_SLS_PROJECT_A"
project_b = "YOUR_SLS_PROJECT_B"
alert_name = "YOUR_ALERT_NAME"
ret = client.get_alert(project_a, alert_name)
ret = client.create_alert(project_b, ret.get_body())
ret.log_print()
示例12:创建日志投递任务
示例代码如下:
# Create Logstore Shipper
from aliyun.log.logexception import LogException
project = "YOUR_SLS_PROJECT"
logstore = "YOUR_SLS_LOGSTORE"
shipper_config = {
'shipperName': 'test_ship22',
'targetType': 'odps',
'targetConfiguration': {
'bufferInterval': 1800,
'enable': True,
'fields': ['__time__', '__source__', '__topic__', 'content'],
'odpsEndpoint': 'http://odps-ext.aliyun-inc.com/api',
'odpsProject': 'TS_DL',
'odpsTable': 'test_odps',
'partitionColumn': ['__time__'],
'partitionTimeFormat': 'yyyy_MM_dd_HH_mm'
}
}
try:
client.create_shipper(project, logstore, shipper_config)
except LogException as ex:
if 'shipperName already exists' in ex.get_error_message():
# create index if index not exists
ret = client.update_shipper(project, logstore, shipper_config)
示例13:查询日志投递任务配置
示例代码如下:
# List and get Logstore Shipper Config
project = "YOUR_SLS_PROJECT"
logstore = "YOUR_SLS_LOGSTORE"
ret = client.list_shipper(project, logstore)
for shipper_name in ret.get_body()['shipper']:
ret = client.get_shipper(project, logstore, shipper_name)
print("------------------------------------------")
print(shipper_name)
print(ret.get_body())