搭好的flume,因为不能完整保存远端传来日志,决定采取自定义sink的方式来记录远端的日志,顺便保存到数据库。动手做起来还是比想象中要简单。
思路就是按照规范编写jar,放在flume的lib目录,并且配置好sink的类型为自己定义的类名,根据自己的需要写好自定义的配置。
整个过程可以参看:https://www.cnblogs.com/jhxxb/p/11584363.html。简单来说继承AbstractSink 类并实现 Configurable 接口。configure函数接收配置,start初始化,stop断开外部存储的连接,process进行处理
如果要保存到oracle数据库,需要把oracle的驱动一起放在lib目录。
对端传来的数据在event.getBody(),还可以在header中放入k-v值,通过event.getHeaders获取。
可以通过拦截器Interceptors执行拦截和过滤动作,参看:https://www.jianshu.com/p/c7b3e357fc6b。
我使用拦截器在每个日志生产服务器的sources上增加该机器的ip,而最终落地到数据库上就可以看到该日志来源于哪个服务器。
client端的配置:
a1.sources.exec.interceptors = ip a1.sources.exec.interceptors.ip.type = host a1.sources.exec.interceptors.ip.hostHeader = ip a1.sources.exec.interceptors.ip.useIP = true