链接复制成功!
使用LTS解析桶日志
应用场景
开启桶日志记录功能后,OBS会自动对桶的访问请求记录日志,并生成日志文件写入您指定的桶(日志存储桶)中,而后通过对生成的日志文件进行深入分析来进行问题定位或了解访问该桶的用户请求性质、类型、趋势等。
本文为您详细介绍通过云日志服务(Log Tank Service,LTS)、事件网格(EventGrid,EG)和函数工作流(FunctionGraph)的结合使用,来将OBS桶的每条日志持续上报到LTS中进行搜索分析。
方案架构
使用LTS解析桶日志的流程如下:
- 桶A所有者在桶中配置日志记录,日志存储桶为桶B。
- 桶所有者或其他有权限访问桶A的用户,在桶A中执行上传、删除对象等操作。
- 桶A中产生的操作记录以日志文件的形式存放至日志存储桶B中。
- 日志文件存放至桶B作为事件源,被路由到事件目标,触发函数执行。
- 函数工作流通过执行函数,从日志存储桶B中获取生成的桶A操作日志文件,然后将日志文件传送至LTS。
- LTS对桶日志文件进行解析。
前提条件
资源和成本规划
|
区域 |
资源 |
资源名称 |
资源说明 |
数量 |
费用 |
|---|---|---|---|---|---|
|
华北-北京四 |
OBS桶 |
test-zcy-bucket-001 |
用于配置访问日志的桶。 在OBS控制台创建桶。 |
1 |
根据上传至桶中的对象占用的存储空间收费,具体请参见存储费用。 |
|
test-zcy-bucket-002 |
作为日志存储桶,用于存储记录桶test-zcy-bucket-001操作的日志文件。 |
1 |
|||
|
日志组 |
lts-group-obs-logging |
在LTS控制台创建日志组,用于管理日志。 |
1 |
本实践中,涉及将桶日志文件上传至LTS并进行解析,计费项包含流量费用、存储费用等,请参见LTS按需计费。 |
|
|
日志流 |
lts-topic-obs-logging |
在LTS控制台创建日志流,用于存储日志,对日志进行分类管理。 |
1 |
||
|
函数 |
OBS_LOG_2_LTS |
用于从OBS桶中获取日志文件后上传至LTS进行日志分析。 您需要在函数工作流(FunctionGraph)控制台创建函数。 |
1 |
根据请求次数、执行时间、执行次数等收费,具体请参见函数工作流计费。 |
|
|
EG事件订阅 |
OBS_LTS_Subscription |
事件订阅将事件源、通道和事件目标绑定在一起,事件源(OBS事件)通过通道触发事件目标(函数)执行。 您需要在OBS控制台的“事件通知”页面创建EG事件订阅。 |
1 |
根据请求次数收费,具体请参见事件网格计费。 |
操作流程
实施步骤
步骤一:在LTS配置日志解析
在LTS控制台配置日志解析,来将桶日志文件中的各参数内容和桶日志字段做对应,便于分析所有桶日志文件。
配置LTS日志解析主要包含:创建日志组、创建日志流、为日志流设置云端结构化解析、为日志流创建索引。
配置LTS日志解析的区域须和日志存储桶在同一区域,否则无法对桶日志进行解析。本实践以“华北-北京四”为例。
1. 创建日志组
日志组(LogGroup)是云日志服务进行日志管理的基本单位,用于对日志流进行分组,一个日志组下面可以创建多个日志流。日志组本身不存储任何日志数据,仅方便您管理日志流。
- 登录云日志服务控制台。
- 单击页面上方的
,区域选择日志存储桶所在区域。本实践为“华北-北京四”。 - 进入“日志管理”页面,单击“创建日志组”。
- 在“创建日志组”页面中,配置以下参数,其他参数保持默认。
关于更多参数说明,请参见创建日志组。
表2 日志组参数说明 参数
示例
描述
日志组名称
lts-group-obs-logging
日志组是云日志服务进行日志管理的基本单位,用于对日志流进行分类。如果日志较多,需要分门别类,建议您为日志组做好命名,方便后续快速查找日志。
LTS会自动生成一个默认的日志组名称,建议您根据业务自定义日志组的名称,创建成功后支持修改日志组名称。命名规范如下:
- 日志组名称只支持输入英文、数字、中文、中划线、下划线及小数点,且不能以小数点、下划线开头或以小数点结尾。长度为1~64个字符。
- 日志组名称不能重复。
企业项目
default
将日志组加入到企业项目中统一管理。如无特殊的企业项目划分和管理需求,此处可直接选择默认企业项目“default”。
企业项目需要开通后才能使用,请参考开通并进入企业管理页面。
- 单击“确定”。
日志组创建成功,即可在日志组列表下方生成一条日志组信息。图3 日志组
- 鼠标放置在日志组名称上,单击日志组ID后的
,记录日志组ID。
图4 记录日志组ID
2. 创建日志流
云日志服务以日志流(LogStream)作为日志管理维度,日志采集后,以日志流为单位,将不同类型的日志分类存储在不同的日志流上,方便对日志进一步分类管理。每个日志流只能属于一个日志组,每个日志组中可创建多个日志流。
- 单击日志组名称对应的
。 - 单击“创建日志流”,在创建日志流页面,配置以下参数,其他参数保持默认。
关于更多参数说明,请参见创建日志流。
表3 日志流参数说明 参数
示例
描述
日志流名称
lts-topic-obs-logging
LTS会自动生成一个默认的日志流名称,建议您根据业务自定义日志流的名称,创建成功后支持修改日志流名称。命名规范如下:
- 只支持输入英文、数字、中文、中划线、下划线及小数点,且不能以小数点、下划线开头或以小数点结尾。
- 长度为1-64个字符。
- 日志流名称不能重复。
企业项目
default
将日志流加入到企业项目中统一管理。如无特殊的企业项目划分和管理需求,此处可直接选择默认企业项目“default”。
企业项目需要开通后才能使用,请参考开通并进入企业管理页面。
日志存储
开启
选择是否开启日志存储。
开启“日志存储”,日志将会被存入搜索引擎,能使用日志全量功能。
本实践中,请勿关闭日志存储开关,否则将无法使用LTS分析OBS桶日志。
- 单击“确定”。
完成日志流的创建,在日志组下方生成一条日志流信息。
图5 日志流
- 鼠标放置在日志流名称上,单击日志流ID后的
,记录日志流ID。
图6 记录日志流ID
3. 为日志流设置云端结构化解析
执行搜索与分析前,需要将上报的日志进行结构化配置和索引配置。日志结构化解析是将非结构化或半结构化的日志数据转换为结构化格式的过程,结构化后的数据具有统一的长度和格式,能够显著提升搜索与分析的效率和准确性。
- 单击2创建的日志流名称,进入日志流详情页面。
- 在左侧单击“日志设置”,并切换至“云端结构化解析”页签。
- 配置以下参数,其他参数保持默认。
关于更多参数说明,请参见设置日志云端结构化解析。

表4 云端结构化解析参数说明 参数
示例
描述
日志结构化方式
Nginx
请根据日志内容的实际场景选择日志结构化方式。
此处选择“Nginx”,表示通过log_format指令来自定义访问日志的格式。
步骤1 选择示例日志
请参见示例日志。
将OBS桶日志文件中的内容复制到此处作为示例日志。
本实践将存储在目标桶test-zcy-bucket-002的任一日志文件中的内容复制到此处。
步骤2 输入Nginx日志配置
请参见Nginx日志配置。
根据配置的桶日志示例输入Nginx日志配置。输入的内容对应示例日志中每个参数对应的字段名称。
步骤3 字段提取
智能提取
将示例日志中的参数和Nginx日志配置中的字段对应。
此处选择“智能提取”,自动将示例日志中的参数和Nginx日志配置中的字段对应。
- 示例日志
3c24f6f8852945a0af194f93ce087fbd test-zcy-bucket-001 [21/Jan/2026:01:42:56 +0000] 124.71.93.140 3c24f6f8852945a0af194f93ce087fbd 0d937eb40eeccf19959a28db26725d2a REST.GET.VERSIONING - "GET /test-zcy-bucket-001/?versioning HTTP/1.1" 200 - 131 - 6 6 "https://console.huaweicloud.com/obs/?locale=zh-cn&agencyId=96aab6bd80c442f3b1c1889e7ec3e2cd®ion=cn-north-4" "HttpClient" - - - - "-" 96aab6bd80c442f3b1c1889e7ec3e2cd HSTAOGINYZPFDM36MT2M
- Nginx日志配置
log_format main '$BucketOwner $BucketName [$time_local] $RemoteIP $Requester $RequestID $Operation $Key ' '"$Request-URI" $HTTPStatus $ErrorCode $BytesSent $ObjectSize $TotalTime $Turn-AroundTime ' '"$Referer" "$User-Agent" $VersionID $STSLogUrn $StorageClass $TargetStorageClass ' '"$DentryName" $IAMUserID $AccessKeyID';
- 示例日志
- 单击“保存”。
4. 为日志流创建索引
索引是一种存储结构,通过配置索引后,可对日志进行查询和分析操作。
- 切换至“索引配置”页签。
- 单击“字段索引”下的“自动配置”。

字段索引:通过添加日志结构化中提取的字段,对日志数据进行统计与分析,如果您在结构化界面对字段名称进行了修改,请重新添加字段索引。
关于更多参数说明,请参见创建LTS日志索引。
- 单击“确定”。
步骤二:在FunctionGraph配置函数
在FunctionGraph配置函数,从OBS桶中获取日志文件,然后使用LTS对桶日志进行解析分析。
创建FunctionGraph函数的区域须和日志存储桶在同一区域,否则无法获取到桶日志。本实践以“华北-北京四”为例。
1. 创建依赖包
函数依赖包包含支持函数业务代码运行的公共库,可以将代码所需的公共库封装成依赖包进行单独管理,便于多函数共享,同时也能有效缩减函数代码在部署与更新过程中的体积。
函数依赖包分为公共依赖包与私有依赖包,本实践所使用的依赖包为私有依赖包。私有依赖包是指在本地将业务代码所需的公共库自行封装的包,即自行创建的依赖包。
- 单击页面左上角的服务列表,选择“计算 > 函数工作流 Function Graph”,进入函数工作流控制台。
- 在左侧导航栏选择“函数 > 依赖包”。
- 单击右上角的“创建依赖包”。
- 在“创建依赖包”页面,按照如下设置参数,其他参数保持默认。
关于更多参数配置请参见创建函数依赖包。

表5 函数依赖包参数说明 参数
示例
描述
依赖包名称
esdk-obs-python
函数依赖包名称,命名规则如下:
- 可包含字母、数字、下划线、点和中划线。
- 以大/小写字母开头,以字母或数字结尾。
- 长度不超过96个字符。
运行时
Python 3.9
选择依赖包使用的运行时语言。
支持选择Cangjie、Node.js、Python、Java、PHP、Go、C#和Custom(定制运行时)。
代码上传方式
上传ZIP文件
选择上传代码的方式。
上传ZIP文件:上传您本地的代码包文件。
单击“添加文件”,选择从esdk-obs-python下载的代码包。
- 单击“创建”。
2. 创建委托
创建委托,用于授权FunctionGraph去访问OBS和LTS,从OBS桶中获取日志文件后上传至LTS进行日志分析。
- 登录控制台“统一身份认证服务”页面。
- 在左侧导航栏中,选择“委托”页面,单击右上方的“创建委托”。
图7 创建委托
- 设置委托相关的参数,其他参数保持默认。
表6 参数说明 参数
示例
描述
委托名称
OBS_LTS_2_FG_Agency
创建的委托名称。
委托名称不能为空。
委托类型
云服务
选择将账号内资源的操作权限委托给其他账号或云服务。
创建用于函数工作流服务访问LTS的委托,此处选择“云服务”。
云服务
函数工作流 FunctionGraph
选择将账号内资源的操作权限委托给某个云服务。当“委托类型”选择“云服务”时,需配置该参数。
创建用于函数工作流服务访问LTS的委托,此处选择“函数工作流 FunctionGraph”。
- 单击“完成”,并在“创建成功”弹窗单击“暂不授权”。在委托列表页面可以看到新创建的委托,即表示委托创建成功。
- 创建自定义策略,用来给委托授予LTS、KMS、VPC相关权限。
- 在左侧导航栏选择“权限管理 > 权限”。
- 在权限页面右上角单击“创建自定义策略”。
- 在创建自定义策略页面,按照如下设置参数内容,其他参数保持默认。
图8 自定义策略设置
表7 自定义策略参数说明 参数
示例
描述
策略名称
VPC_LTS_KMS_Policy
创建的自定义策略名称。
不能为空且只能包含如下字符:大小写字母、中文、数字、空格或特殊字符(-_.,)。
云服务
云日志服务(LTS)
数据加密服务(KMS)
虚拟私有云(VPC)
选择权限所属的云服务。
此处需要给委托授予LTS、KMS、VPC相关权限。
一个服务的权限选择完成后,单击下方的“添加权限”,再继续添加下一个服务的权限。
操作
请参见表8。
需要授予的云服务操作权限。
- 单击“确定”,在权限列表页面可以看到新创建的自定义策略,即表示创建成功。
- 创建自定义策略,用来给委托授予OBS相关权限。
- 在左侧导航栏选择“权限管理 > 权限”。
- 在权限页面右上角单击“创建自定义策略”。
- 在创建自定义策略页面,按照如下设置参数内容,其他参数保持默认。
图9 自定义策略设置
表9 自定义策略参数说明 参数
示例
描述
策略名称
OBS_LOG_GET_Policy
创建的自定义策略名称。
不能为空且只能包含如下字符:大小写字母、中文、数字、空格或特殊字符(-_.,)。
云服务
对象存储服务(OBS)
选择权限所属的云服务。
本实践中需要给委托授予OBS的获取对象内容和元数据权限“obs:object:GetObject”。
操作
obs:object:GetObject
需要授予的云服务操作权限。
- 单击“确定”,在权限列表页面可以看到新创建的自定义策略,即表示创建成功。
- 给创建的委托授予LTS、KMS、VPC、OBS相关权限。
3. 创建函数
创建函数用于从OBS桶中获取日志文件后上传至LTS进行日志分析。
- 单击页面左上角的服务列表,选择“计算 > 函数工作流 Function Graph”,进入函数工作流控制台。
- 在左侧导航栏选择“函数 > 函数列表”。
- 单击“创建函数”。
- 在“创建函数”页面,按照如下设置参数,其他参数保持默认。
关于更多参数配置请参见创建函数。

表10 函数参数说明 参数类型
参数
示例
描述
-
选择创建方式
创建空白函数
选择创建函数的方式。
此处选择“创建空白函数”,即从头开始自定义创建函数。
基本信息
函数类型
事件函数
选择触发函数执行的方式。
事件函数,即通过触发器来触发函数执行。
区域
华北-北京四
选择要部署函数代码的区域。
此处请选择和日志存储桶相同的区域。
函数名称
OBS_LOG_2_LTS
函数名称,命名规则如下:
- 可包含字母、数字、下划线和中划线。
- 以大/小写字母开头,以字母或数字结尾。
- 长度不超过60个字符。
企业项目
default
将函数加入到企业项目中统一管理。
如无特殊的企业项目划分和管理需求,此处可直接选择默认企业项目“default”。关于企业项目的使用,具体请参见企业用户权限与项目管理。
委托名称
OBS_LTS_2_FG_Agency
用于委托函数工作流服务去访问其他云服务。
此处需要为函数工作流服务授予LTS、OBS等服务权限,使得函数工作流服务可以从OBS桶中获取日志文件后上传至LTS进行日志分析。
此处选择2创建的委托“OBS_LTS_2_FG_Agency”。
运行时
Python 3.9
选择用来编写函数的语言。
高级设置
函数访问公网
关闭
开启时,函数可以通过默认网卡访问公网。
如果该参数打开的同时,“函数访问VPC内资源”也是开启状态,则能否访问公网由配置的VPC决定。
函数访问VPC内资源
打开
开启时,函数将使用配置的VPC所绑定的网卡进行网络访问同时禁用函数工作流的默认网卡。
此处的VPC和子网使用系统自动选择的即可,无需修改。如果您的账号下无可用VPC和子网,请创建和函数在同一区域的VPC,请参见创建虚拟私有云和子网。
日志记录
打开
启用日志功能后,函数运行过程中产生的日志会上报到LTS。
启用后,将按需收取日志管理费用,计费详情请参见云日志服务计费项。
日志配置方式
自动配置
选择关联的日志组。
选择“自动配置”表示关联默认日志组。
此处请勿选择“自定义配置”并关联步骤一:在LTS配置日志解析创建的日志组和日志流。
- 单击“创建函数”,完成函数的创建,并进入函数详情页。
- 将如下代码复制到函数详情页的代码区域,修改“obs_endpoint”和“lts_ip”参数值后单击“部署代码”。
- 将“obs_endpoint”参数值修改为日志存储桶所在的终端节点,本实践为“obs.cn-north-4.myhuaweicloud.com”。桶所在的终端节点信息,请在桶“概览”页面的“域名信息”中查找,具体请参见查看桶信息。
- 将“lts_ip”参数值中的区域名称修改为日志存储桶所在的区域名称,本实践为“cn-north-4”。区域名称请在地区和终端节点中查找。
import time import urllib.parse import os import random import string import json import requests from obs import ObsClient localMountPath = '/tmp/' def handler(event, context): log_group_id = context.getUserData("log_group_id") log_stream_id = context.getUserData("log_stream_id") logger = context.getLogger() auth_token = context.getToken() project_id = context.getProjectID() obs_endpoint = "obs.cn-north-4.myhuaweicloud.com" lts_ip = "https://lts-access.cn-north-4.myhuaweicloud.com:8102" data = event.get("data", None) (src_bucket, input_object_key) = get_obs_obj_info(data) logger.info("src bucket name: %s", src_bucket) input_object_key = urllib.parse.unquote_plus(input_object_key) logger.info("src object key: %s", input_object_key) download_dir = gen_local_download_path() obs_client = new_obs_client(context, obs_endpoint) if not download_from_obs(context, obs_client, src_bucket, input_object_key, download_dir): return 'ERROR' url = lts_ip + '/v2/' + project_id + '/lts/groups/' + log_group_id + '/streams/' + log_stream_id + '/tenant/contents' headers = {'content-type': 'application/json', 'X-Auth-Token': auth_token} download_file = download_dir + input_object_key f = open(download_file) lines = f.readlines() for line in lines: logger.info(line) payload = {"log_time_ns": int(round(time.time() * 1000000000)), "contents": line, "labels": {"user_tag": "string"}} response = requests.post(url, data=json.dumps(payload), headers=headers, verify=False).text logger.info(response) os.remove(download_file) return 'SUCCESS' def download_from_obs(context, obs_client, bucket, object_key, download_dir): resp = obs_client.getObject(bucket, object_key, downloadPath=download_dir + object_key) if resp.status < 300: return True else: context.getLogger().error('failed to download_from_obs ' 'errorCode: %s, errorMessage: %s' % ( resp.errorCode, resp.errorMessage)) return False def gen_local_download_path(): download_path = localMountPath if not download_path.endswith('/'): download_path += '/' letters = string.ascii_letters download_dir = download_path + ''.join( random.choice(letters) for i in range(16)) + '/' os.makedirs(download_dir) return download_dir def new_obs_client(context, obsServer): ak = context.getSecurityAccessKey() sk = context.getSecuritySecretKey() st = context.getSecurityToken() return ObsClient(access_key_id=ak, secret_access_key=sk, security_token=st, server=obsServer) def get_obs_obj_info(record): if 's3' in record: s3 = record['s3'] return (s3['bucket']['name'], s3['object']['key']) else: obs_info = record['obs'] return (obs_info['bucket']['name'], obs_info['object']['key'])
- 添加代码依赖包。6的样例代码依赖OBS的SDK,因此需要通过依赖包的形式进行引入。
- 在“代码”页签底部,单击“添加依赖包”。
- 在右侧的“选择依赖包”弹窗,选择“私有依赖包”作为依赖包源。
- 依赖包名称选择3创建的依赖包“esdk-obs-python”。
- 单击“确定”。
- 配置函数常规设置。
- 在函数详情页面中部,切换至“设置 > 常规设置”页签。
- 设置如下信息:
- 执行超时时间(秒):10000
- 内存(MB):1024
- 单击“保存”。
- 设置环境变量。用来关联LTS的日志组和日志流信息。
- 切换至“设置”页签,单击左侧导航列表的“环境变量”。
- 单击“编辑环境变量”,在右侧弹窗单击“添加环境变量”。
- 添加以下环境变量,并单击右下角的“确定”。
表11 环境变量 键
值
说明
log_group_id
714a4f22-8c85-4a43-a8d1-9b60fe64004a
LTS中日志组的ID。
值为步骤一:在LTS配置日志解析中创建的日志组ID。
log_stream_id
c7a4f097-bfbb-44ee-b33f-30a0dede1e87
LTS中日志流的ID。
值为步骤一:在LTS配置日志解析中创建的日志流ID。
步骤三:在EG配置事件订阅
使用EG通知来作为事件触发器,触发函数执行。即创建EG事件订阅,将事件源、通道和事件目标绑定在一起,事件源(OBS事件)通过通道触发事件目标(函数)执行。
创建EG事件订阅的区域须和日志存储桶在同一区域,否则无法获取到事件源(OBS事件)。本实践以“华北-北京四”为例。
- 单击页面左上角的服务列表,选择“存储 > 对象存储服务 OBS”,进入桶列表页面。
- 单击日志存储桶名称,进入对象列表页。
- 在左侧导航栏选择“数据管理 > 事件通知”。
- 在“EG通知”页签,单击“创建”,进入EG事件订阅详情页。
- 修改订阅名称。
单击上方订阅名称旁的
,在“修改订阅”弹窗,修改订阅名称后单击“确定”。本示例中订阅名称修改为“OBS_LTS_Subscription”。 - 配置事件源。
- 单击“事件源”,按照如下设置参数,其他参数保持默认。
关于更多参数配置请参见创建事件订阅。
图10 设置事件源
表12 事件源参数说明 参数
示例
描述
选择提供方
云服务
选择事件源提供方。
云服务,即华为云服务作为事件源提供方。
事件源
OBS应用事件源
选择云服务事件源。
OBS应用事件源,即通过操作OBS桶内对象的特定行为来产生事件源。
桶
test-zcy-bucket-002
选择产生事件源的OBS桶,即本示例中的日志存储桶。
事件类型
- OBS:DWR:ObjectCreated:PUT
- OBS:DWR:ObjectCreated:POST
选择产生事件源的OBS操作。
- OBS:DWR:ObjectCreated:PUT:通过页面或Put请求创建或覆盖桶对象。
- OBS:DWR:ObjectCreated:POST:使用Post请求创建或覆盖桶对象。
对象名前缀
test-zcy-bucket-001-log/
指定对象产生的OBS事件才会触发EG通知。
此处填写OBS日志存储桶中存储日志的目录。
- 单击“确定”,完成事件源配置。
- 单击“事件源”,按照如下设置参数,其他参数保持默认。
- 配置事件目标。
- 单击“事件目标”,按照如下设置参数,其他参数保持默认。
关于更多参数配置请参见创建事件订阅。
图11 设置事件目标
表13 事件目标参数说明 参数
示例
描述
选择提供方
云服务
选择事件目标提供方。
云服务,即华为云服务作为事件目标提供方。
事件目标
FunctionGraph(函数计算)
选择云服务事件目标。
FunctionGraph(函数计算),即由函数工作流服务执行特定操作。
函数
OBS_LOG_2_LTS
选择要执行的函数。
本实践中选择步骤二:在FunctionGraph配置函数中已创建的函数。
委托
EG_TARGET_AGENCY
用于委托事件网格服务EG去访问其他云服务。
本实践中需要委托EG去访问FunctionGraph。
如无委托,可单击旁边的“创建委托”,将会自动创建名为“EG_TARGET_AGENCY”的委托。
- 单击“确定”,完成事件目标配置。
- 单击“事件目标”,按照如下设置参数,其他参数保持默认。
- 单击页面右上角的“保存”。
步骤四:结果验证
- 登录云日志服务控制台。
- 单击页面上方的
,区域选择步骤一:在LTS配置日志解析中日志组所在区域。本实践为“华北-北京四”。 - 在“日志管理”页面中部,单击步骤一:在LTS配置日志解析创建的日志组左侧的
,并单击日志流名称。

- 在日志流的“日志搜索”页面,即可查看已解析的桶日志。
图12 查看日志解析结果
您可以通过在左侧选择字段来查看特定字段值的日志,如在“ErrorCode”下单击“404”,即可筛选出访问404的日志记录。