可以使用以下代码编写一个自定义的Flume拦截器,用于过滤掉不是JSON格式的日志数据:

package com.example.flume.interceptor;

import com.google.gson.JsonSyntaxException;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.interceptor.Interceptor;
import org.apache.flume.interceptor.InterceptorBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JsonInterceptor implements Interceptor {

    private static final Logger logger = LoggerFactory.getLogger(JsonInterceptor.class);

    @Override
    public void initialize() {
        // Do nothing
    }

    @Override
    public Event intercept(Event event) {
        try {
            String eventBody = new String(event.getBody(), "UTF-8");
            if (isJson(eventBody)) {
                return event;
            } else {
                logger.warn("Event is not JSON: {}", eventBody);
                return null;
            }
        } catch (Exception e) {
            logger.error("Error intercepting event: {}", e.getMessage());
            return null;
        }
    }

    private boolean isJson(String eventBody) {
        try {
            Gson gson = new Gson();
            gson.fromJson(eventBody, Object.class);
            return true;
        } catch (JsonSyntaxException ex) {
            return false;
        }
    }

    @Override
    public java.util.List<Event> intercept(java.util.List<Event> list) {
        java.util.List<Event> interceptedEvents = new java.util.ArrayList<Event>();
        for (Event event : list) {
            Event interceptedEvent = intercept(event);
            if (interceptedEvent != null) {
                interceptedEvents.add(interceptedEvent);
            }
        }
        return interceptedEvents;
    }

    @Override
    public void close() {
        // Do nothing
    }

    public static class Builder implements InterceptorBuilder {

        @Override
        public void configure(Context context) {
            // Do nothing
        }

        @Override
        public Interceptor build() {
            return new JsonInterceptor();
        }
    }
}

然后在Flume配置文件中指定使用这个拦截器,例如:

# Define the source, channel, and sink
agent.sources = mySource
agent.channels = myChannel
agent.sinks = mySink

# Configure the source
agent.sources.mySource.type = exec
agent.sources.mySource.command = tail -F /var/log/myapp.log

# Configure the channel
agent.channels.myChannel.type = memory
agent.channels.myChannel.capacity = 1000
agent.channels.myChannel.transactionCapacity = 100

# Configure the sink
agent.sinks.mySink.type = hdfs
agent.sinks.mySink.hdfs.path = /data/logs/%Y-%m-%d/
agent.sinks.mySink.hdfs.filePrefix = events-
agent.sinks.mySink.hdfs.fileSuffix = .log
agent.sinks.mySink.hdfs.rollInterval = 0
agent.sinks.mySink.hdfs.rollSize = 0
agent.sinks.mySink.hdfs.rollCount = 10000
agent.sinks.mySink.hdfs.writeFormat = Text
agent.sinks.mySink.hdfs.batchSize = 1000
agent.sinks.mySink.hdfs.useLocalTimeStamp = true
agent.sinks.mySink.hdfs.fileType = DataStream
agent.sinks.mySink.channel = myChannel

# Configure the interceptor
agent.sources.mySource.interceptors = myInterceptor
agent.sources.mySource.interceptors.myInterceptor.type = com.example.flume.interceptor.JsonInterceptor$Builder

这个配置将会使用我们编写的JsonInterceptor拦截器,来过滤掉不是JSON格式的日志数据

4日志为json数据编写flume拦截器过滤日志不是json的数据

原文地址: https://www.cveoy.top/t/topic/hcVN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录