4. OCI日志高级配置

OCI Logging 的基础能力是采集平台日志,但生产环境真正需要的是“把业务自己产生的日志也纳入统一可观测体系”。这就涉及四个关键能力:自定义日志(Custom Log)、日志搜索语法、日志保存与归档策略,以及日志转发到 Object Storage 或 Streaming。它们分别解决“采什么”“怎么查”“存多久”“往哪送”的问题。

一、自定义日志:把应用日志接入 OCI Logging

OCI 自定义日志用于采集非平台原生的日志,典型来源包括:运行在 Compute 实例上的应用日志文件、容器标准输出、以及通过 API 写入的自定义日志。以 Compute 上的应用日志为例,配置路径是:Logging → Logs → Create Custom Log → 选择 Log Group → 选择资源类型为 Compute Instance → 指定日志源。

日志源有两种模式:文件路径采集和API 写入。文件路径采集需要指定绝对路径,例如 /var/log/myapp/app.log,并配置解析器(Parser)。解析器决定日志如何被结构化,常见类型有:

  • 无解析(None):整行作为 message,适合纯文本日志。
  • Syslog:解析时间戳、主机、进程等字段。
  • JSON:按 JSON 键拆分为字段,适合结构化应用日志。
  • CSV / 正则:按分隔符或正则表达式提取字段。

如果应用输出 JSON,例如:

{"ts":"2025-03-11T08:12:33Z","level":"ERROR","svc":"order","msg":"payment timeout","orderId":"A10293"}

选择 JSON 解析器后,level、svc、orderId 都会成为可搜索字段,后续就能用 level = 'ERROR' 精确过滤。这一步是自定义日志能否被高效检索的前提——解析器选错,字段就查不出来。

二、日志搜索语法:从“能查”到“查得准”

OCI Logging 的搜索基于查询语句,基本结构是“时间范围 + 过滤条件 + 关键字”。常用语法要点如下:

  • 字段过滤:data.level = 'ERROR'、data.svc = 'order'。
  • 全文关键字:直接写 payment timeout,匹配 message 内容。
  • 逻辑组合:and、or、not,例如 data.level = 'ERROR' and data.svc = 'order'。
  • 模糊匹配:使用 * 通配,例如 data.orderId = 'A10*'。
  • 时间范围:在控制台选择相对时间(最近 1 小时、24 小时)或自定义区间。

一个实用的排障查询示例:

search "payment timeout" | data.level = 'ERROR' and data.svc = 'order'

它的含义是:在最近时间窗口内,查找 message 含 “payment timeout”、且 level 为 ERROR、服务为 order 的日志。搜索结果会按时间倒序展示,点击单条可展开完整字段。需要注意的是,搜索字段名取决于解析器输出的结构,JSON 解析后字段通常位于 data 下,因此写查询时不要漏掉前缀。

三、日志保存与归档策略

日志不能无限期保留在可搜索状态,否则存储成本会持续上升。OCI Logging 通过 Log Group 的保留策略控制日志在 Logging 中的保存时长,常见可选值为 1、7、14、30、60、90、180、365 天,或永久保留。超过保留期的日志会被自动删除。

因此生产上通常采用“热—温—冷”分层:

  • 热数据:最近 7~30 天留在 Logging,供实时搜索与告警。
  • 温/冷数据:通过 Service Connector 或日志转发,把日志持续写入 Object Storage,长期保存。
  • 合规归档:Object Storage 可再配合生命周期规则,把对象从标准层转为归档层,进一步降低成本。
保留策略是“删除”而非“归档”。如果日志有合规留存要求,必须在保留期到期前完成转发,否则日志会被直接清除,无法找回。

四、转发到 Object Storage 或 Streaming

OCI 提供两种主要转发方式,选择取决于下游用途:

目标适用场景特点
Object Storage长期归档、离线分析、合规留存低成本、批量写入、按对象存储
Streaming实时消费、对接 SIEM、流式分析低延迟、按分区消费、可多消费者

转发通常通过 Service Connector Hub 实现:源选择 Logging,目标选择 Object Storage 或 Streaming,中间可加过滤条件。例如只转发 ERROR 级别日志:

Source: Logging (Log Group = prod-app-logs)
Filter: data.level = 'ERROR'
Target: Object Storage (Bucket = prod-log-archive, Prefix = app/error/)
Batch: 5 MB 或 300 秒

写入 Object Storage 时,日志会按时间分片成对象,路径类似 app/error/2025/03/11/08/xxx.json.gz。若目标是 Streaming,则日志进入指定 Stream 的分区,下游可用 Kafka 兼容接口或 OCI SDK 消费。

OCI 日志高级配置:采集 → 检索 → 保留 → 转发 自定义日志采集 Compute 文件路径 /var/log/myapp/app.log Parser: JSON / Syslog 字段: level, svc, orderId Log Group prod-app-logs 保留策略: 30 天 热数据可搜索 日志搜索语法 data.level = 'ERROR' and data.svc = 'order' "payment timeout" 时间范围 + 通配 * Service Connector 过滤 ERROR 批量 5MB/300s 持续转发 Object Storage Bucket: prod-log-archive Prefix: app/error/ 长期归档 / 生命周期 Streaming Stream: prod-log-stream 分区消费 SIEM / 实时分析 关键判断:保留策略到期会删除日志,需在到期前完成转发;JSON 解析后字段位于 data 下,搜索时须带前缀。 选型:长期归档选 Object Storage,实时消费选 Streaming;两者都通过 Service Connector Hub 统一编排。

五、配置要点与常见问题

实际配置时,有几个容易踩坑的点值得注意。第一,IAM 权限:Service Connector 需要具备读取 Logging、写入 Object Storage 或 Streaming 的策略,否则连接器会创建成功但转发失败。第二,解析器与字段一致性:如果应用日志格式变更(例如从纯文本改为 JSON),必须同步更新解析器,否则新字段无法被搜索。第三,批量参数:Object Storage 目标通常按大小或时间触发写入,批量过小会产生大量小对象,批量过大则延迟升高,5 MB / 300 秒是常见起点。第四,成本:Logging 按摄取量计费,Object Storage 按存储和请求计费,Streaming 按吞吐计费,转发前应评估日志量,避免把调试日志全量长期保留。

不要把“保留 365 天”当作归档方案。Logging 的保留是搜索窗口,不是低成本存储;真正需要长期留存时,应转发到 Object Storage 并配置生命周期规则。

综合来看,自定义日志解决采集入口,解析器决定字段结构,搜索语法决定排障效率,保留策略控制热数据窗口,Service Connector 负责把日志送往 Object Storage 或 Streaming。把这五者串起来,才能形成一条从产生到归档的完整日志链路。