apache flume-ng做agent拦截器可以输出IP

在flume日志收集过程中,为了解决识别日志来源机器的问题,通过自定义一个名为AppendIPInterceptor的flume拦截器来实现。拦截器在事件(event)的body中附加IP地址,确保每条日志都能标识其原始机器。配置中,AppendIPBuilder作为拦截器的启动类,并在flume.conf中指定。虽然性能影响尚未测试,但此方法能有效定位日志来源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在做flume日志收集工作,需要将每台日机器上的日志收集,然后发送到kafka,接着有专门的日志处理程序从kafka中进行消费,其中有个问题就是在消费的时候需要知道当前的日志来自哪台机器,查阅了flume文档发现没有提供该功能,因此就自己定一个flume拦截器。基本的流程就是将日志内容从flume event中取出,然后拼接上自定义的IP,然后再将body设置到event中。

架构部署图如下
image

flume拦截器代码如下

AppendIPInterceptor

package com.eju.ess;

import java.util.List;

import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;

import com.google.common.base.Charsets;

public class AppendIPInterceptor implements Interceptor {

    private String serviceId=null;

    public AppendIPInterceptor(String _serviceId){
        serviceId=_serviceId;
    }

    public Event intercept(Event arg0) {
        String eventBody = new String(arg0.getBody(),Charsets.UTF_8);
        String fmt="%s - %s";
        arg0.setBody(String.format(fmt, serviceId,eventBody).getBytes());
        return arg0;
    }

    public List<Event> intercept(List<Event> events) {
        for (Event event : events) {
            intercept(event);
        }
        return events;
    }

    public void close() {
        //~ null
    }

    public void initialize() {
        //~ null
    }

    /*public static class Builder implements Interceptor.Builder {

        public void configure(Context context) {

        }

        public Interceptor build() {
            return new AppendIPInterceptor();
        }  
    } */
}

在上面的代码中,close和initialize很容易看懂分别是拦截器关闭需要做的事情和拦截器初始化需要做的事情,在日志中增加IP这个业务中,不需要在这个两个方法中写任何内容。

主要的业务代码还是写在intercept中,在flume系统中每一条日志都是一个event,enven中包含heard、和body,增加IP这个业务主要是将event中的body取出,然后拼接上IP,接着将拼接后的结果在设置到event中的body中。

AppendIPBuilder

package com.eju.ess;

import org.apache.flume.Context;
import org.apache.flume.interceptor.Interceptor;

public class AppendIPBuilder implements Interceptor.Builder{

    private String serviceId=null;
    public void configure(Context context) {
        String configServiceId=context.getString("serviceId");
        serviceId=configServiceId;
    }

    public Interceptor build() {
        return new AppendIPInterceptor(serviceId);
    }

}

上面代码是一个builder,是用来启动拦截器,在flume.conf中需要指定该类的绝对路径。

flume.conf

a1.sources.r1.interceptors = i1
a1.sources.r1.interceptors.i1.type = com.eju.ess.AppendIPBuilder
a1.sources.r1.interceptors.i1.serviceId = 10.99.70.51

上面代码就是在flume.conf的配置,a1.sources.r1.interceptors.i1.type指定AppendIPBuilder的绝对路径,a1.sources.r1.interceptors.i1.serviceId配置一下机器的IP或者机器名字。

有同学可能会考虑性能问题,性能问题我确实还没有测试过,哈哈。

扫描下方Q群二维码快速加入Java学习交流群
Java学习交流Q群

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值