作者:潘伟龙(豁朗)
在新能源汽车行业,贯穿车端、手机端与云端的运维体系每天都会产生海量的日志数据。这些日志覆盖面广、格式多样,绝大多数属于弱结构化甚至非结构化数据,其字段不统一、结构多变,给后续的数据处理与分析带来了极大的挑战。如何高效地将这些繁杂、异构的日志数据进行标准化清洗和结构化转换,是实现运维自动化管理、智能告警和业务洞察的关键基础。
依托日志服务(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 技术支持。
less
graph TD
%% Source: OSS -> Target: Logstore
A[oss: gyhangzhou] --> B[hcltestcd101.test1]
C[oss: gyhangzhou] --> D[hcltestcd101.test2]
%% Logstore -> ETL
B -->|test1| E[etl: etl-1748412289-337270]
D -->|test2| F[etl: etl-1748412289-337270]
%% ETL -> Targets
E --> 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 格式)
json
{
"ts": "2024-06-17T11:26:00Z",
"vin": "LVSHF6196L1234567",
"event": "arrive_station",
"station_id": "SH_CHG_001",
"location": {
"lat": 31.2362,
"lon": 121.4798
}
}
写入处理器语句:
scss
* | 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)
处理结果:
yaml
__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 日志:
ini
2024-06-17T11:27:11Z station=SH_CHG_001 event=plug_in vin=LVSHF6196L1234567 result=success connector=DC
写入处理器语句:
css
* | 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)
处理结果:
yaml
__time__: 1718623631
connector: DC
event: plug_in
result: success
station: SH_CHG_001
time: 2024-06-17T11:27:11Z
vin: LVSHF6196L1234567
3. 启动充电(手机端扫码/车机屏操作)
手机 App 日志(KV 格式):
ini
2024-06-17 11:27:12 user_id=87234 action=charge_start vin=LVSHF6196L1234567 station_id=SH_CHG_001 os=android13
写入处理器语句:
css
* | 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)
处理结果:
yaml
__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):
ini
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"}
写入处理器语句:
css
* | 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)
结果:
yaml
__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
车端充电启动日志:
json
{
"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
}
}
写入处理器语句:
scss
* | 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)
结果:
yaml
__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. 充电进行中(车端定期上报,充电过程数据)
json
{
"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
}
}
写入处理器语句:
scss
* | 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)
结果:
yaml
__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. 充电结束(自动结束/手动停止)
json
{
"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"
}
写入处理器语句:
scss
* | 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)
结果:
yaml
__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
桩端日志:
ini
2024-06-17T12:05:57Z station=SH_CHG_001 event=charge_end vin=LVSHF6196L1234567
result=success duration=2256s total_kwh=28.7
写入处理器语句:
css
* | 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)
结果:
yaml
__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 格式):
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"
}
写入处理器语句:
scss
* | parse-json content
| project-away content
| extend __time__ = cast(to_unixtime(date_parse(ts, '%Y-%m-%dT%H:%i:%sZ')) as bigint)
结果:
yaml
__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. 充电桩一天总充电次数/总电量/分时段充电峰值
每日总充电次数和总电量:
sql
* | SELECT
station_id,
date_trunc('day', __time__) AS day,
COUNT(*) AS charge_count,
SUM(total_kwh) AS total_kwh
FROM
log
WHERE
event = 'charging_stop'
GROUP BY
station_id, day
ORDER BY
charge_count DESC

分时段充电次数(如每小时峰值统计):
sql
* | SELECT
date_trunc('hour', __time__) as hour,
station_id,
COUNT(*) AS charge_count
FROM
log
WHERE
event = 'charging_start'
GROUP BY
hour, station_id
ORDER BY
hour,station_id
limit all

2. 充电失败的主因(插枪异常/认证异常/设备故障)
统计各异常类型发生次数:
sql
* | SELECT
reason, -- 假设清洗后有失败原因归类字段reason
COUNT(*) AS fail_count
FROM
log
WHERE
event IN ('charging_start', 'plug_in', 'charging_auth')
AND result = 'fail'
GROUP BY
reason
ORDER BY
fail_count DESC

3. 一站式追溯充电行为全链路(到达、插枪、认证、启动、完成、支付)
使用查询方式,按 VIN 和时间顺序追溯某用户/车辆全流程日志:
makefile
vin: LVSHF6196L5181426

4. SOC 提升曲线及充电速度监控
提取某次充电过程SOC随时间变化
vbnet
vin:LVSHF6196L0034 and station_id: SH_CHG_008 | SELECT
date_trunc('minute', __time__) as dt,
battery_soc
FROM
log
ORDER BY
dt

统计平均充电速度(SOC 提升率):
vbnet
event: charging_status
| SELECT date_trunc('hour', __time__) as dt,
vin,
station_id,
(MAX(battery_soc) - MIN(battery_soc)) AS avg_soc_per_hour
FROM
log
GROUP BY
dt,vin, station_id

5. 异常持续低速充电或频繁断充自动报警
检测充电过程平均速度异常低(如 SOC 提升过慢):
sql
event: charging_status
| SELECT date_trunc('hour', __time__) as dt,
vin,
station_id,
(MAX(battery_soc) - MIN(battery_soc)) AS avg_soc_per_hour
FROM
log
GROUP BY
dt,vin, station_id
HAVING avg_soc_per_hour < 0.2 -- 低于阈值触发告警
检测短时间内多次充电启动与终止(频繁断充):
查询分析右上角时间范围选择相对 1 小时。
sql
* | SELECT
vin,
station_id,
COUNT(*) AS interrupt_count
FROM
log
WHERE
event IN ('charging_start', 'charging_stop')
GROUP BY
vin, station_id
HAVING interrupt_count > 3 -- 阈值可按需设置
总结
新能源汽车行业日志数据因来源多样、格式混杂且需实时处理,面临清洗困难、跨地域汇聚、成本控制及运维透明化等挑战。SLS 通过全链路接入多源日志、智能解析格式、动态脱敏;跨地域数据加工;百万级实时处理能力;写入处理器实现零临时存储降本;血缘可视化工具清晰呈现数据流转,来解决上述问题。最后以充电场景为例,充电桩、车机、手机等日志经 SLS 统一清洗后,支持故障排查与分析。
相关参考
SPL 语法
help.aliyun.com/zh/sls/spl-...
写入处理器
help.aliyun.com/zh/sls/sls-...
写入处理器与 Logtail 处理配置、数据加工的对比
help.aliyun.com/zh/sls/comp...
阿里云可观测 MCP 服务
点击此处,了解阿里云日志服务 SLS 产品详情