泛型日志提取管道通过logextractor抽象类解耦格式解析与字段提取,支持json、kv、正则等多格式即插即用,配合可组合的fieldresolver和批处理引擎,实现格式无关的结构化日志统一处理。

用泛型类抽象日志提取管道,核心是把“日志格式差异”和“字段提取逻辑”解耦,让同一套骨架适配 JSON、Key-Value、纯文本、Nginx access log 等多种输入,同时支持动态扩展新格式而不动主流程。
泛型日志处理器定义:统一入口,类型安全
定义一个泛型抽象类 LogExtractor
- parse(String raw):将原始日志字符串解析为结构化对象 T,失败时返回 Optional.empty()
- extract(T parsed, String field):从已解析对象中按字段名提取值,支持嵌套路径(如 "user.id" 或 "request.headers.x-trace-id")
子类只需实现这两个方法,无需关心缓存、线程安全或批量调度——这些由基类封装。
多格式适配器即插即用:JSON、KV、正则三板斧
针对常见日志格式,提供开箱即用的实现:
- JsonLogExtractor:用 Jackson 或 Gson 解析,extract 支持 JsonPath 表达式(如 "$.error.stackTrace")
- KvLogExtractor:适配 "key1=val1 key2=val2" 类型,自动识别空格/等号分隔,支持引号包裹值(如 msg="user login failed")
- RegexLogExtractor:预编译正则模板(如 ^(\S+) (\S+) \[(.*?)\] "(.*?)" (\d+) (\d+)),捕获组命名映射到字段名
新增格式?写一个新子类,注册进工厂即可,不改调度器、不改下游分析模块。
字段提取策略可组合:Lambda + 配置驱动
避免硬编码字段逻辑。每个 extractor 可绑定一组 FieldResolver
- 支持默认值、空值跳过、类型转换(如把字符串 "true" 转 boolean)
- 支持条件启用:resolver("trace_id").when(ctx -> ctx.getLevel().equals("ERROR"))
- 配置文件中声明字段清单与 resolver 类型,运行时反射构造,实现“配置即代码”
例如,对所有 ERROR 日志自动注入 trace_id、duration_ms、upstream_ip,其余日志仅取 level 和 message。
管道编排与性能兜底:批处理 + 缓存 + 回退
泛型类之上构建轻量级管道引擎:
- 接收日志流(FileReader / KafkaConsumer / SLS Pull),按批次(如 1000 条)分发给匹配的 extractor
- 内置 LRU 缓存最近 100 个解析失败的 raw log 样本,便于诊断格式漂移
- 当某 extractor 连续失败超阈值,自动降级到通用 RegexLogExtractor + 宽松正则,保障管道不中断
- 输出统一为 StructuredLog
对象,含 parsed、extractedFields、parseError、timestamp 等元信息
这样,一条 Nginx 日志和一条 Python logging 输出,经不同 extractor 处理后,能被同一个统计模块按 "status_code" 或 "http_status" 字段聚合,真正实现“格式无关”的分拣。










