破解异构日志清洗五大难题,全面提升运维数据可观测性
作者:潘伟龙(豁朗)
在新能源汽车行业,贯穿车端、手机端与云端的运维体系每天都会产生海量的日志数据。这些日志覆盖面广、格式多样,绝大多数属于弱结构化甚至非结构化数据,其字段不统一、结构多变,给后续的数据处理与分析带来了极大的挑战。如何高效地将这些繁杂、异构的日志数据进行标准化清洗和结构化转换,是实现运维自动化管理、智能告警和业务洞察的关键基础。
依托日志服务(SLS)的一站式数据清洗能力,将纷繁复杂的原始日志高效转化为统一、可分析的数据格式。通过 SQL 实现数据汇总分析,并灵活配置监控告警,全面提升运维数据的可观测性和响应能力,实现对新能源汽车系统运行状态的深度洞察与智能化管理。
新能源汽车日志数据分析五大挑战
1. 混杂日志清洗困境
为保障全链路可观测性,通常需要将车端、手机端以及后端云服务等日志统一接入同一个日志平台(如 Logstore)。日志采集方式五花八门,比如 SDK、Logtail、OSS Bucket、开源 Agent 等,采集到的日志格式千差万别(如 syslog、k8s 日志、KV、JSON 等),导致日志字段结构不统一,甚至在同一 Logstore 中混杂存储,给日志解析、字段标准化和查询分析带来极大难度。此外,还需要对数据中的敏感字段(如 VIN 码、位置、手机号、证件号)在采集阶段进行脱敏,保障用户隐私安全。
2. 数据汇聚挑战
新能源汽车的业务和运维常常分散在不同地区、不同云平台,各地域的数据需要高效、安全地汇聚到特定的中心进行分析。这种跨地域、跨云环境下的数据同步与整合,极易产生网络延迟、传输安全和一致性等问题。
3. 秒级响应压力
运维场景尤其是在紧急客户投诉或者安全事件发生时,对日志查询和分析速度提出了极高要求。必须保障日志能够实时采集、即时查询,在秒级时间内帮助一线运维人员定位和解决问题。
4. 成本控制难题
大规模的数据流转和多环节临时存储会显著提高存储成本。因此,企业希望在日志流转、加工等各环节中减少不必要的中间存储,占用更少的临时 Logstore 空间,从而降低总体运营费用。
5. 运维流程透明化难题
复杂的数据流转与加工过程通常涉及众多 Logstore、加工任务、定时 SQL 任务以及导入任务,彼此之间关联错综复杂。这种情况下,数据在各 Logstore 之间的流向往往难以清晰梳理,不仅显著增加了整体运维的难度,也大大降低了任务的可管控性。
SLS 数据清洗解决方案
针对新能源汽车系统运维中面临的日志复杂性挑战,SLS 针对上述数据五大挑战提供如下解决方案:包括 SLS 全链路日志接入加工能力、跨地域数据加工能力、高性能数据清洗、数据流转与存储成本优化、SLS Logstore 血缘关系可视化。
混杂日志清洗困境 —— SLS 全链路日志接入加工能力
- 多源统一接入: SLS 支持通过 SDK、Logtail、OSS Bucket 以及各类开放协议如 Kafka、Syslog 等多种写入方式,支持将来自车端、手机端、云端的不同日志,写入 SLS Logstore,实现一站式日志查询,确保全链路覆盖。
-
复杂格式智能提取: 针对 JSON、KV、syslog、k8s 日志等多种弱结构化日志,SLS 内置强大的字段提取能力,支持自定义正则表达式、条件语句(let 语法)驱动的日志格式识别与处理,即使没有明确字段区分,也可实现分流解析。
- syslog 协议日志解析
-
- K8 容器日志:KV、JSON 混合解析
- 隐私合规脱敏: SLS 支持基于正则表达式的动态字段脱敏机制,在采集或入库环节即可精准去除 VIN、位置轨迹、手机号等敏感信息,满足数据安全与隐私合规要求。
数据汇聚挑战 —— SLS 跨地域数据加工能力
- SLS 支持跨地域的数据加工,可以将不同地域、不同云环境中的业务数据,按照指定规则和权限,安全、高效地汇聚至同一 Logstore 进行分析,消除地域孤岛,支持集中化管理和分析。
秒级响应压力 —— SLS 高性能数据清洗
SLS 具备强大的实时处理与查询能力,数据加工支持秒级延迟,单作业 2Mil/s(百万条每秒)的处理速度(相当于 2GB/s),并且处理速度支持按照 shard 数量进行线性提高,支持在紧急事件、客户投诉、业务峰值场景下,快速定位问题,显著提升运维效率与客户响应速度。
成本控制难题 —— SLS 数据流转与存储优化
- SLS 写入处理器与数据加工具备同等的数据处理能力,可以在日志写入过程中直接进行数据清洗、脱敏、降噪。借助写入处理器实现成本优化: 利用 SLS 的“零临时存储”写入处理器,在数据写入阶段实现数据加工和字段标准化,无需临时 Logstore 中转,从而降低存储成本和系统复杂度。在不需要保存原始日志的情况下,可以节省临时 Logstore 的存储开销。
运维流程透明化难题 —— SLS Logstore 血缘可视化
阿里云可观测 MCP 服务提供了 Project、Logstore、任务级别的工具,通过 MCP 工具,可以列举用户下 project 列表,列举 project 对应的任务列表(包括数据导入、数据加工、数据投递、定时 SQL 等),通过 LLM 对任务配置的解析,分析出其中源 Logstore 及目标 Logstore,进一步可以通过对话让 Agent 画出 Mermaid 等的绘图工具的文本,将绘图文本贴到工具中,即可展示 Logstore 间的数据流转。
注意:SLS 任务列表工具正在内测中,如需使用可以联系 SLS 技术支持。
graph TD%% Source: OSS -> Target: LogstoreA[oss: gyhangzhou] --> B[hcltestcd101.test1]C[oss: gyhangzhou] --> D[hcltestcd101.test2]%% Logstore -> ETLB -->|test1| E[etl: etl-1748412289-337270]D -->|test2| F[etl: etl-1748412289-337270]%% ETL -> TargetsE --> G[hcltestcd103.test1]E --> H[hcltestcd1102.test1]E --> I[hcltestcd103.test2]E --> J[hcltestcd1102.test2]F --> K[hcltestcd103.test1]F --> L[hcltestcd101.test1]
借助工具网站展示效果:
接下来以新能源车充电为例,来介绍通过各种异构源数据接入、并使用写入处理器来对数据进行清洗、最终完成充电场景的分析。
新能源车充电场景的日志清洗分析实战
用户驾驶车辆到达充电站后,系统自动记录定位轨迹。用户停车下车后,插入充电枪,此时车辆或充电桩检测插枪事件并自动发起云端认证。用户通过扫码、车机屏或 App 启动充电,操作信息在充电桩、车辆与云端交互并产生日志,后台同时处理认证和计费等逻辑。充电过程中,车端与充电桩持续上报充电状态与告警,App 或云端同步显示充电进度和费用。充电结束后,相关设备上报“充电结束”日志。
写入处理器方案介绍
在整个新能源车交互的过程中,涉及充电桩、车、手机、后台服务等多个终端及服务,其中充电桩的日志上传可以通过 SDK、MQTT、Logtail、定期上传 OSS 等方式上传日志到 SLS Logstore,手机端使用 SDK 直传日志到 SLS Logstore,车端通过定期上传文件到 OSS,再通过 SLS 实时导入 OSS 文件的方式上传日志,车机后端服务部署在 K8s 集群中,直接通过 SLS 的 Logtail-ds 采集日志到 SLS Logstore。
通过将多个终端的日志采集到同一个 Logstore,来实现全局的充电分析和故障排查,由于不同的终端日志格式差别较大,需要对数据进行清洗规整,这里通过 SLS 写入处理器的方式,使用 SPL 语法对弱结构化数据进行结构化处理,便于后续数据监控运维分析告警。
写入处理器日志清洗
1. 车端进出站轨迹日志(JSON 格式)
{"ts": "2024-06-17T11:26:00Z","vin": "LVSHF6196L1234567","event": "arrive_station","station_id": "SH_CHG_001","location": {"lat": 31.2362,"lon": 121.4798}
}
写入处理器语句:
* | parse-json content | parse-json location | project-away content,location| extend __tidme__ = cast(to_unixtime(date_parse(ts, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
处理结果:
__time__: 1718623560
ts: 2024-06-17T11:26:00Z
vin: LVSHF6196L1234567
event: arrive_station
station_id: SH_CHG_001
lat: 31.2362
lon: 121.4798
2. 充电枪插入(车端/桩端事件)
充电桩侧 API 日志:
2024-06-17T11:27:11Z station=SH_CHG_001 event=plug_in vin=LVSHF6196L1234567 result=success connector=DC
写入处理器语句:
* | parse-regexp content, '(\d+-\d+-\d+T\d{2}:\d{2}:\d{2}Z) (.*)' as time, content| parse-kv content, ' ', '=' | project-away content| extend __time__ = cast(to_unixtime(date_parse(time, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
处理结果:
__time__: 1718623631
connector: DC
event: plug_in
result: success
station: SH_CHG_001
time: 2024-06-17T11:27:11Z
vin: LVSHF6196L1234567
3. 启动充电(手机端扫码/车机屏操作)
手机 App 日志(KV 格式):
2024-06-17 11:27:12 user_id=87234 action=charge_start vin=LVSHF6196L1234567 station_id=SH_CHG_001 os=android13
写入处理器语句:
* | parse-regexp content, '(\d+-\d+-\d+ \d{2}:\d{2}:\d{2}) (.*)' as time, content| parse-kv content, ' ', '=' | project-away content| extend __time__ = cast(to_unixtime(date_parse(time, '%Y-%m-%d %H:%i:%s')) as bigint)
处理结果:
__time__: 1718623632
action: charge_start
os: android13
station_id: SH_CHG_001
time: 2024-06-17 11:27:12
user_id: 87234
vin: LVSHF6196L1234567
云端认证/计费服务日志(嵌入 JSON):
2024-06-17T11:27:13Z pod=charge-gw ns=prod log={"user_id":"87234","vin":"LVSHF6196L1234567","api":"/api/charge/start","station_id":"SH_CHG_001","result":"started","ts":"2024-06-17T11:27:13Z"}
写入处理器语句:
* | parse-regexp content, '(\d+-\d+-\d+T\d{2}:\d{2}:\d{2}Z) (.*)' as time, content| parse-kv content, ' ', '=' | project-away content| parse-json log| project-away log| extend __time__ = cast(to_unixtime(date_parse(time, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
结果:
__time__: 1718623633
api: /api/charge/start
ns: prod
pod: charge-gw
result: started
station_id: SH_CHG_001
ts: 2024-06-17T11:27:13Z
user_id: 87234
vin: LVSHF6196L1234567
车端充电启动日志:
{"ts": "2024-06-17T11:27:14Z","vin": "LVSHF6196L1234567","event": "charging_start","station_id": "SH_CHG_001","battery": {"voltage": 381.0,"current": 25.1,"soc": 45}
}
写入处理器语句:
* | parse-json content| project-away content| parse-json battery| project-away battery| extend __time__ = cast(to_unixtime(date_parse(ts, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
结果:
__time__: 1718623634
current: 25.100000
event: charging_start
soc: 45
station_id: SH_CHG_001
ts: 2024-06-17T11:27:14Z
vin: LVSHF6196L1234567
voltage: 381.000000
4. 充电进行中(车端定期上报,充电过程数据)
{"ts": "2024-06-17T11:47:14Z","vin": "LVSHF6196L1234567","event": "charging_status","station_id": "SH_CHG_001","battery": {"voltage": 410.6,"current": 3.2,"soc": 88}
}
写入处理器语句:
* | parse-json content| project-away content| parse-json battery| project-away battery| extend __time__ = cast(to_unixtime(date_parse(ts, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
结果:
__time__: 1718624834
current: 3.200000
event: charging_status
soc: 88
station_id: SH_CHG_001
ts: 2024-06-17T11:47:14Z
vin: LVSHF6196L1234567
voltage: 410.600000
5. 充电结束(自动结束/手动停止)
{"ts": "2024-06-17T12:05:56Z","vin": "LVSHF6196L1234567","event": "charging_stop","station_id": "SH_CHG_001","battery": {"voltage": 415.0,"current": 0.0,"soc": 92},"result": "success"
}
写入处理器语句:
* | parse-json content| project-away content| parse-json battery| project-away battery| extend __time__ = cast(to_unixtime(date_parse(ts, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
结果:
__time__: 1718625956
current: 0.000000
event: charging_stop
result: success
soc: 92
station_id: SH_CHG_001
ts: 2024-06-17T12:05:56Z
vin: LVSHF6196L1234567
voltage: 415.000000
桩端日志:
2024-06-17T12:05:57Z station=SH_CHG_001 event=charge_end vin=LVSHF6196L1234567
result=success duration=2256s total_kwh=28.7
写入处理器语句:
* | parse-regexp content, '(\d+-\d+-\d+T\d{2}:\d{2}:\d{2}Z) (.*)' as time, content| parse-kv content, ' ', '=' | project-away content| extend __timde__ = cast(to_unixtime(date_parse(time, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
结果:
__time__: 1718625957
duration: 2256s
event: charge_end
result: success
station: SH_CHG_001
time: 2024-06-17T12:05:57Z
total_kwh: 28.7
vin: LVSHF6196L1234567
云端计费结算日志(JSON 格式):
{"ts": "2024-06-17T12:06:01Z","vin": "LVSHF6196L1234567","user_id": "87234","station_id": "SH_CHG_001","event": "charge_bill","total_kwh": 28.7,"total_fee": 88.23,"pay_method": "wechat"
}
写入处理器语句:
* | parse-json content| project-away content| extend __time__ = cast(to_unixtime(date_parse(ts, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
结果:
__time__: 1718625961
event: charge_bill
pay_method: wechat
station_id: SH_CHG_001
total_fee: 88.230000
total_kwh: 28.700000
ts: 2024-06-17T12:06:01Z
user_id: 87234
vin: LVSHF6196L1234567
运维分析
在得到清洗后的规整数据后,可以对数据进行运维分析,针对充电场景可以使用 SQL 进行运维分析:
- 充电桩一天总充电次数/总电量/分时段充电峰值
- 充电失败的主因(插枪异常/认证异常/设备故障)
- 一站式追溯充电行为全链路(到达、插枪、认证、启动、完成、支付)
- SOC 提升曲线及充电速度监控
- 异常持续低速充电或频繁断充自动报警
注意:下方图表数据为模拟数据,用来说明 SQL 分析结果。
1. 充电桩一天总充电次数/总电量/分时段充电峰值
每日总充电次数和总电量:
* | SELECTstation_id,date_trunc('day', __time__) AS day,COUNT(*) AS charge_count,SUM(total_kwh) AS total_kwh
FROMlog
WHEREevent = 'charging_stop'
GROUP BYstation_id, day
ORDER BYcharge_count DESC
分时段充电次数(如每小时峰值统计):
* | SELECTdate_trunc('hour', __time__) as hour,station_id,COUNT(*) AS charge_count
FROMlog
WHEREevent = 'charging_start'
GROUP BYhour, station_id
ORDER BYhour,station_id
limit all
2. 充电失败的主因(插枪异常/认证异常/设备故障)
统计各异常类型发生次数:
* | SELECTreason, -- 假设清洗后有失败原因归类字段reasonCOUNT(*) AS fail_count
FROMlog
WHEREevent IN ('charging_start', 'plug_in', 'charging_auth')AND result = 'fail'
GROUP BYreason
ORDER BYfail_count DESC
3. 一站式追溯充电行为全链路(到达、插枪、认证、启动、完成、支付)
使用查询方式,按 VIN 和时间顺序追溯某用户/车辆全流程日志:
vin: LVSHF6196L5181426
4. SOC 提升曲线及充电速度监控
提取某次充电过程SOC随时间变化
vin:LVSHF6196L0034 and station_id: SH_CHG_008 | SELECTdate_trunc('minute', __time__) as dt,battery_soc
FROMlog
ORDER BYdt
统计平均充电速度(SOC 提升率):
event: charging_status
| SELECT date_trunc('hour', __time__) as dt,vin,station_id,(MAX(battery_soc) - MIN(battery_soc)) AS avg_soc_per_hour
FROMlog
GROUP BYdt,vin, station_id
5. 异常持续低速充电或频繁断充自动报警
检测充电过程平均速度异常低(如 SOC 提升过慢):
event: charging_status
| SELECT date_trunc('hour', __time__) as dt,vin,station_id,(MAX(battery_soc) - MIN(battery_soc)) AS avg_soc_per_hour
FROMlog
GROUP BYdt,vin, station_id
HAVING avg_soc_per_hour < 0.2 -- 低于阈值触发告警
检测短时间内多次充电启动与终止(频繁断充):
查询分析右上角时间范围选择相对 1 小时。
* | SELECTvin,station_id,COUNT(*) AS interrupt_count
FROMlog
WHEREevent IN ('charging_start', 'charging_stop')
GROUP BYvin, station_id
HAVING interrupt_count > 3 -- 阈值可按需设置
总结
新能源汽车行业日志数据因来源多样、格式混杂且需实时处理,面临清洗困难、跨地域汇聚、成本控制及运维透明化等挑战。SLS 通过全链路接入多源日志、智能解析格式、动态脱敏;跨地域数据加工;百万级实时处理能力;写入处理器实现零临时存储降本;血缘可视化工具清晰呈现数据流转,来解决上述问题。最后以充电场景为例,充电桩、车机、手机等日志经 SLS 统一清洗后,支持故障排查与分析。
相关参考
SPL 语法
https://help.aliyun.com/zh/sls/spl-overview/
写入处理器
https://help.aliyun.com/zh/sls/sls-write-processor/
写入处理器与 Logtail 处理配置、数据加工的对比
https://help.aliyun.com/zh/sls/comparison-of-ingest-processor-logtail-plug-in-and-data-transformation
阿里云可观测 MCP 服务
https://github.com/aliyun/alibabacloud-observability-mcp-server
点击此处,了解阿里云日志服务 SLS 产品详情