在新能源汽车行业,贯穿车端、手机端与云端的运维体系每天都会产生海量的日志数据。这些日志覆盖面广、格式多样,绝大多数属于弱结构化甚至非结构化数据,其字段不统一、结构多变,给后续的数据处理与分析带来了极大的挑战。如何高效地将这些繁杂、异构的日志数据进行标准化清洗和结构化转换,是实现运维自动化管理、智能告警和业务洞察的关键基础。
依托日志服务(SLS)的一站式数据清洗能力,将纷繁复杂的原始日志高效转化为统一、可分析的数据格式。通过SQL实现数据汇总分析,并灵活配置监控告警,全面提升运维数据的可观测性和响应能力,实现对新能源汽车系统运行状态的深度洞察与智能化管理。
新能源汽车日志数据分析五大挑战
混杂日志清洗困境
为保障全链路可观测性,通常需要将车端、手机端以及后端云服务等日志统一接入同一个日志平台(如Logstore)。日志采集方式五花八门,比如SDK、Logtail、OSS Bucket、开源Agent等,采集到的日志格式千差万别(如syslog、k8s日志、KV、JSON等),导致日志字段结构不统一,甚至在同一Logstore中混杂存储,给日志解析、字段标准化和查询分析带来极大难度。此外,还需要对数据中的敏感字段(如VIN码、位置、手机号、证件号)在采集阶段进行脱敏,保障用户隐私安全。

数据汇聚挑战
新能源汽车的业务和运维常常分散在不同地区、不同云平台,各地域的数据需要高效、安全地汇聚到特定的中心进行分析。这种跨地域、跨云环境下的数据同步与整合,极易产生网络延迟、传输安全和一致性等问题。

秒级响应压力
运维场景尤其是在紧急客户投诉或者安全事件发生时,对日志查询和分析速度提出了极高要求。必须保障日志能够实时采集、即时查询,在秒级时间内帮助一线运维人员定位和解决问题。

成本控制难题
大规模的数据流转和多环节临时存储会显著提高存储成本。因此,企业希望在日志流转、加工等各环节中减少不必要的中间存储,占用更少的临时Logstore空间,从而降低总体运营费用。

运维流程透明化难题
复杂的数据流转与加工过程通常涉及众多 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: 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格式)
{
"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.47982. 充电枪插入(车端/桩端事件)
充电桩侧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: LVSHF6196L12345673. 启动充电(手机端扫码/车机屏操作)
手机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.0000004. 充电进行中(车端定期上报,充电过程数据)
{
"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.6000005. 充电结束
(自动结束/手动停止)
{
"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. 充电桩一天总充电次数/总电量/分时段充电峰值
每日总充电次数和总电量:
* | 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

分时段充电次数(如每小时峰值统计):
* | 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. 充电失败的主因(插枪异常/认证异常/设备故障)
统计各异常类型发生次数:
* | 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和时间顺序追溯某用户/车辆全流程日志:
vin: LVSHF6196L5181426

4. SOC提升曲线及充电速度监控
提取某次充电过程SOC随时间变化
vin:LVSHF6196L0034 and station_id: SH_CHG_008 | SELECT
date_trunc('minute', __time__) as dt,
battery_soc
FROM
log
ORDER BY
dt
统计平均充电速度(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
FROM
log
GROUP BY
dt,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
FROM
log
GROUP BY
dt,vin, station_id
HAVING avg_soc_per_hour < 0.2 -- 低于阈值触发告警检测短时间内多次充电启动与终止(频繁断充):
查询分析右上角时间范围选择相对1小时
* | 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统一清洗后,支持故障排查与分析。