破解异构日志清洗五大难题,全面提升运维数据可观测性

作者:潘伟龙(豁朗)

在新能源汽车行业,贯穿车端、手机端与云端的运维体系每天都会产生海量的日志数据。这些日志覆盖面广、格式多样,绝大多数属于弱结构化甚至非结构化数据,其字段不统一、结构多变,给后续的数据处理与分析带来了极大的挑战。如何高效地将这些繁杂、异构的日志数据进行标准化清洗和结构化转换,是实现运维自动化管理、智能告警和业务洞察的关键基础。

依托日志服务(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 服务

github.com/aliyun/alib...

点击此处,了解阿里云日志服务 SLS 产品详情

相关推荐
洁辉11 小时前
Spring Cloud 全栈指南:构建云原生微服务的终极武器
spring cloud·微服务·云原生
阿里云云原生13 小时前
加工进化论:SPL 一键加速日志转指标
云原生
阿里云云原生20 小时前
从 Python 演进探寻 AI 与云对编程语言的推动
云原生
亲爱的非洲野猪20 小时前
关于k8s Kubernetes的10个面试题
云原生·容器·kubernetes
西京刀客21 小时前
k8s之configmap
云原生·容器·kubernetes
阿里云云原生2 天前
Higress MCP 服务管理,助力构建私有 MCP 市场
云原生
zzywxc7872 天前
云原生 Serverless 架构下的智能弹性伸缩与成本优化实践
云原生·架构·serverless