Skip to content

Readers

Andrewei edited this page Feb 5, 2018 · 11 revisions

logkit目前提供十一种读取日志的方式,分别为File ReaderElasticSearch ReaderMongoDB ReaderMySQL ReaderMicroSoft SQL Server ReaderPostgreSQL ReaderKafka ReaderRedis ReaderSocket ReaderHttp ReaderScript Reader

如何添加更多Reader(自定义Reader)?

目前,实现一个logkit的自定义reader只需要实现以下接口即可。

// Reader 是一个通用的行读取reader接口
type Reader interface {
	Name() string
	Source() string
	ReadLine() (string, error)
	SetMode(mode string, v interface{}) error
	Close() error
	SyncMeta()
}
  • Name()方法是为了方便的获取Reader名称,做出区别。
  • Source()方法返回读取的数据源说明,通常是一个自定义的标记,如读取文件的话就是文件路径,读取mysql的话可以是数据库地址、名称、表等。
  • ReadLine() 就是读取一行数据,这个“行”是一个宽泛的概念,并不一定以\n分隔就是行,那么如何定义行呢? SetMode()方法解决这个问题。
  • SetMode()方法定义行首的正则表达式,也可以不做这个定义,默认以\n分隔作为一行。
  • Close()方法包括关闭文件句柄、服务连接等常规的结束操作。
  • SyncMeta() 同步读取的元信息,记录读取位置,以便重启等异常情况下可以继续读取,不会丢失数据也不会重复读取。

从数据来源上分类,数据读取大致可分为从文件读取、从数据存储服务端读取以及从消息队列中读取三类。

每一类Reader均在发送成功后通过SyncMeta()函数记录读取的位置,保证数据不会因为runner意外中断而丢失。

从文件读取数据

这一类最为常见,logkit支持的已经较为完善,可以参阅file reader了解相关内容,支持包括多文件编码格式支持、读取限速等多种功能。

从数据存储服务中读取数据

这一类目前logkit支持从MongoDB、MySQL、MSSQL、PostgreSQL、Elasticsearch这五个数据源中读取。

  • SyncMeta()的策略上,这一类从服务器中读取的数据可以采用时间戳策略,如MongoDB、MySQL中记录的数据,应该都包含一个时间戳(timestamp)的字段,每次读取数据均按这个时间戳字段排序,以此获得新增的数据或者数据更新(数据有更新也要更新这个时间戳字段)。

  • 周期性运行,需要为用户设计类似定时器等策略,方便用户可以周期性运行,不断同步收集服务器中的数据。

  • 考虑性能,在数据量大的情况下,要分批次获取数据,可以参阅不同数据源服务器提供的批量获取数据的方式,针对性的设计性能最优的数据拉取模式。

从消息队列中读取数据

从消息队列中读取数据在设计上最为简单,因为消息队列服务器在提供服务的时候就会考虑到读取的各类问题,直接利用好消费队列的API即可。注意记录读取的Offset,防止数据丢失。

Clone this wiki locally