📙
iLogtail用户手册
1.8.4
1.8.4
  • 关于
    • 什么是iLogtail
    • 发展历史
    • 产品优势
    • 开源协议
    • 社区版和企业版的对比说明
  • 安装
    • 快速开始
    • Docker使用
    • Kubernetes使用
    • 守护进程
    • 发布记录
    • 支持的操作系统
    • 源代码
      • 下载
      • 编译
      • Docker镜像
      • 编译依赖
    • 镜像站
  • 概念
    • 关键概念
    • 数据流水线
  • 配置
    • 采集配置
    • 系统参数
    • 日志
  • 数据流水线
    • 概览
    • 插件版本管理
    • 输入
      • 文本日志
      • 脚本执行数据
      • 容器标准输出
      • 文本日志(debug)
      • MetricInput示例插件
      • 主机Meta数据
      • Mock数据-Metric
      • eBPF网络调用数据
      • 主机监控数据
      • MySQL Binlog
      • GO Profile
      • GPU数据
      • HTTP数据
      • ServiceInput示例插件
      • Journal数据
      • Kafka
      • Mock数据-Service
      • SqlServer 查询数据
      • OTLP数据
      • PostgreSQL 查询数据
      • Syslog数据
    • 处理
      • 添加字段
      • 添加云资产信息
      • 原始数据
      • 数据脱敏
      • 丢弃字段
      • 字段加密
      • 条件字段处理
      • 日志过滤
      • Go时间格式解析
      • Grok
      • Json
      • 日志转SLS Metric
      • 正则
      • 重命名字段
      • 分隔符
      • 键值对
      • 多行切分
      • 字符串替换
    • 聚合
      • 基础
      • 上下文
      • 按Key分组
      • 按GroupMetadata分组
    • 输出
      • Kafka(Deprecated)
      • kafkaV2
      • ClickHouse
      • ElasticSearch
      • SLS
      • 标准输出/文件
      • OTLP日志
      • Pulsar
      • HTTP
      • Loki
    • 加速
      • 分隔符加速
      • Json加速
      • 正则加速
  • 工作原理
    • 文件发现
    • 插件系统
  • 可观测性
    • 日志
  • 开发者指南
    • 开发环境
    • 日志协议
      • 协议转换
      • 增加新的日志协议
      • 协议
        • sls协议
        • 单条协议
    • 代码风格
    • 数据模型
    • 插件开发
      • 开源插件开发引导
      • Checkpoint接口
      • Logger接口
      • 如何开发Input插件
      • 如何开发Processor插件
      • 如何开发Aggregator插件
      • 如何开发Flusher插件
      • 如何生成插件文档
      • 插件文档规范
      • 纯插件模式启动
    • 测试
      • 单元测试
      • E2E测试
    • 代码检查
      • 检查代码规范
      • 检查文件许可证
      • 检查依赖包许可证
  • 贡献指南
    • 贡献指南
    • 开发者
    • 成就
  • 性能测试
    • 容器场景iLogtail与Filebeat性能对比测试
  • 管控工具
    • 使用介绍
    • 通信协议
    • 开发指南
  • Awesome iLogtail
    • 走近iLogtail社区版
    • iLogtail社区版使用入门
    • iLogtail社区版开发者指南
    • iLogtail社区版使用案例
Powered by GitBook
On this page
  1. 开发者指南
  2. 日志协议

增加新的日志协议

如果iLogtail暂时不支持您所需的日志协议,您可以为iLogtail增加该协议并添加相应的协议转换函数,具体步骤如下:

  1. 如果您的协议支持Protobuf或其它可通过模式定义生成相应内存结构的编码方式,您需要首先在./pkg/protocol目录下新建一个以协议名为命名的文件夹,然后在该文件夹中增加一个以编码方式为命名的子文件夹,在该文件中存放相应的模式定义文件,然后将由代码生成工具生成的与该模式定义文件相对应的Go代码文件放置在父目录中。目录组织结构如下:

    ./pkg/protocol/
    ├── <protocol_name>
    │   ├── <encoding>
    │       └──  模式定义文件
    │   └── 代码生成工具生成的Go文件
    └── converter
        ├── converter.go
        ├── <protocol>_log.go
        └── 测试文件
  2. 在./pkg/protocol/converter目录下新建一个以<protocol>_log.go命名的文件,并在该文件中实现下列函数:

    func (c *Converter) ConvertToXXXProtocolLogs(logGroup *sls.LogGroup, targetFields []string) (logs interface{}, values [][]string, err error)
    
    func (c *Converter) ConvertToXXXProtocolStream(logGroup *sls.LogGroup, targetFields []string) (stream interface{}, values [][]string, err error)

    其中,函数名中的“XXX”为协议名(可缩写),参数中的logGroup为sls日志组,targetFields为需要提取值的字段名,返回值中的logs为与协议对应的数据结构组成的数组,stream为代表该日志组的字节流,values为每条日志或日志组tag中targetFields字段对应的值,err为返回的错误。

    该函数必须支持以下功能:

    1. 对输入日志进行相应的转换

    2. 能够根据c.TagKeyRenameMap重命名sls协议中LogTag字段的Key

    3. 能够根据targetFields找到对应字段的值

    4. 对于部分编码格式,能够根据c.ProtocolKeyRenameMap重命名协议字段的Key

    为了完成上述第2和第3点,iLogtail提供了下列帮助函数:

    func convertLogToMap(log *sls.Log, logTags []*sls.LogTag, src, topic string, tagKeyRenameMap map[string]string) (contents map[string]string, tags map[string]string)
    
    func findTargetValues(targetFields []string, contents, tags, tagKeyRenameMap map[string]string) (values map[string]string, err error)

    各函数的用途如下:

    • convertLogToMap:将符合sls协议的日志以及对应logGroup中的其他元信息转换成以map形式存储的contents和tags,同时根据tagKeyRenameMap重命名sls协议中LogTag字段的Key。

    • findTargetValues:在convertLogToMap获得的contents和tags中寻找targetFields字段对应的值,如果targetFields中包含被更名的默认tag键,则寻找过程还需要借助tagKeyRenameMap。

  3. 在./pkg/protocol/converter/converter.go中,依次做出如下改变:

    • 新增protocolXXX常量,“XXX”为协议名,常量的值也为协议名

    • 如果协议支持新的编码方式,则新增encodingXXX常量,“XXX”为编码方式,常量的值也为编码方式

    • 在supportedEncodingMap中,增加该协议支持的编码类型

    • 在c.DoWithSelectedFields方法的switch语句中新增一个case子句,case名为协议名,子句内容为return c.ConvertToXXXProtocolLogs(logGroup, targetFields),其中涉及的函数即为第2步中编写的函数

    • 在c.ToByteStreamWithSelectedFields方法的switch语句中新增一个case子句,case名为协议名,子句内容为return c.ConvertToXXXProtocolStream(logGroup, targetFields),其中涉及的函数即为第2步中编写的函数

  4. 在./doc/cn/developer-guide/log-protocol/converter.md的附录、README.md中增加协议相关内容,并在./doc/cn/developer-guide/log-protocol/protocol-spec文件夹下新增<protocol>.md文件描述具体的协议形式。

Previous协议转换Next协议

Last updated 1 year ago