SpringBoot对接Flume
在大数据流处理当中,我们需要从项目中,采集到用户的行为日志,通过kafka
,输送到计算引擎中,进行计算分析。这其中的日志文件的采集,我们需要通过Flume
完成对接。
①依赖坐标
<!--引入Flume-->
<dependency>
<groupId>org.apache.flume</groupId>
<artifactId>flume-ng-sdk</artifactId>
<version>1.9.0</version>
</dependency>
②引入Flume对接的项目依赖
flume
官方网站上提供开源项目,以便使用者在用 日志采集
时完成快速对接。
获取地址:https://pan.baidu.com/s/1chY1Ia7aBPtY7AVXZ_rrdQ
获取码:cgi8
这个开源项目包,以
com
为最外层包,将此包直接引入自己的项目java
的直接子目录下(与自己的项目第一级包同级),即可。
③配置日志文件
配置项目中的日志文件 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender" >
<encoder>
<pattern>%p %c#%M %d{yyyy-MM-dd HH:mm:ss} %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="flume" class="com.gilt.logback.flume.FlumeLogstashV1Appender">
<flumeAgents>
pro1:44444, <!--这里配置集群,此处搭建的是个伪集群-->
pro2:44444,
pro1:44444
</flumeAgents>
<flumeProperties>
connect-timeout=4000;
request-timeout=8000
</flumeProperties>
<!--这里为了测试调低了,生成环境下要调高-->
<batchSize>1</batchSize>
<!--每1ms发送一次这里为了测试调低了,生成环境下要调高-->
<reportingWindow>1</reportingWindow>
<additionalAvroHeaders>
myHeader=myValue
</additionalAvroHeaders>
<application>smapleapp</application>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%p %c#%M %d{yyyy-MM-dd HH:mm:ss} %m%n</pattern>
</layout>
</appender>
<!-- 控制台输出⽇志级别 -->
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
<logger name="com.baizhi.service" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="flume" />
</logger>
<logger name="com.baizhi.interceptor" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="flume" />
</logger>
</configuration>
④项目中引用
项目中,要对接 flume 就变的很容易了,只要是 log4j日志对象的输出,都将直接通过网络,输送到接收端。
- 示例:
package com.baizhi.interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//将此组件交给工厂
@Component
public class UserInputFeatureInterceptor implements HandlerInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(UserInputFeatureInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取信息
String name = request.getParameter("name");
String password = request.getParameter("password");
LOGGER.info("请求参数为\t"+name+"\t"+password);
/*2020-03-29 15:56:35.783 INFO 12620 --- [nio-9999-exec-8] c.b.i.UserInputFeatureInterceptor : 请求参数为 测试数据2 000000 */
return true;
}
}
⑤flume端设置
在/apache-flume-1.9.0-bin
的跟目录中,的conf
文件夹中,创建(自定义)example02.perproties
文件,配置如下:
# 声明基本条件 Source Channel Sink
a1.sources = s1
a1.sinks = sk1
a1.channels = c1
#配置Source组件,从Socket中接收文本数据
a1.sources.s1.type = avro
a1.sources.s1.bind = pro2
a1.sources.s1.port = 44444
#配置Sink组件 将接收数据打印在日志控制台
a1.sinks.sk1.type = logger
#配置Channel通道,主要负责数据缓冲
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
#进行组件间的绑定
a1.sources.s1.channels = c1
a1.sinks.sk1.channel = c1
启动flume
准备接收数据
[root@pro2 apache-flume-1.9.0-bin] ./bin/flume-ng agent --conf conf/ --name a1 -conf-file conf/example02.perproties -Dflume.root.logger=INFO,console