logback整合flume将日志写到hdfs
1、导入依赖
<!-- https://mvnrepository.com/artifact/com.gilt.flume/logback-flume-appender -->
<dependency>
<groupId>com.gilt.flume</groupId>
<artifactId>logback-flume-appender</artifactId>
<version>0.1.7</version>
</dependency>
2、日志配置文件
logback.xml
添加appender部分,请根据具体情况配置:
<!-- 将日志输出到flume -->
<appender name="flume" class="com.gilt.logback.flume.FlumeLogstashV1Appender">
<!-- flume agent配置 {hostname}:{port}多个之间用逗号隔开 -->
<flumeAgents>
192.168.10.53:6666
</flumeAgents>
<!-- 附加属性,以{key}={value}分隔的格式创建flume RpcClient -->
<flumeProperties>
connect-timeout=4000;
request-timeout=8000
</flumeProperties>
<!-- 设置要报告的event的批量大小,覆盖默认值 50 -->
<batchSize>100</batchSize>
<!-- 覆盖尝试填充批次所花费的最长时间,介于 100 毫秒和 10 秒之间 -->
<reportingWindow>1000</reportingWindow>
<!-- 以{key}={value}分隔的格式向event添加附加标题 -->
<additionalAvroHeaders>
dir=mylogs
</additionalAvroHeaders>
<!-- 程序名称 -->
<application>demo</application>
<!-- 日志格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - \(%file:%line\) - %message%n%ex</pattern>
</layout>
</appender>
3、flume配置
在{FLUME_HOME}/conf,新建配置文件,请根据具体情况并查看flume手册进行配置:
flume-hdfs.conf.properties
# agent
a1.sources = r1
a1.channels = c1
a1.sinks = k1
# source
a1.sources.r1.type=avro
a1.sources.r1.bind=0.0.0.0
# 与appender配置中端口一致
a1.sources.r1.port=6666
# channel,类型为内存
a1.channels.c1.capacity = 1000
a1.channels.c1.type = memory
a1.channels.c1.transactionCapacity = 100
# sink
a1.sinks.k1.type=hdfs
# hdfs集群地址+输出路径,这里引用的dir和application就是appender配置中的<additionalAvroHeaders>和<application>标签
a1.sinks.k1.hdfs.path=hdfs://mycluster/flume/%{dir}/%{application}
a1.sinks.k1.hdfs.fileType=DataStream
a1.sinks.k1.hdfs.writeFormat=Text
a1.sinks.k1.hdfs.round=true
# 以下三个配置是event滚动的配置
# 当前文件写入达到该值时间后触发滚动创建新文件(0表示不按照时间来分割文件),单位:秒。(默认值30)
a1.sinks.k1.hdfs.rollInterval=0
# 当前文件写入达到该大小后触发滚动创建新文件(0表示不根据文件大小来分割文件),单位:字节。(默认值1024)
a1.sinks.k1.hdfs.rollSize=0
# 当前文件写入Event达到该数量后触发滚动创建新文件(0表示不根据 Event 数量来分割文件)。(默认值10)
a1.sinks.k1.hdfs.rollCount=0
# 关闭非活动文件的超时时间(0表示禁用自动关闭文件),单位:秒。(默认值0,表示禁用)
a1.sinks.k1.hdfs.idleTimeout=5
# 如false文件会有hdfs.inUseSuffix的后缀(默认.tmp),在滚动后消失。如为true,写文件时不会带任何后缀
a1.sinks.k1.hdfs.emptyInUseSuffix=true
# Flume在HDFS文件夹下创建新文件的固定前缀(默认FlumeData)
a1.sinks.k1.hdfs.filePrefix=%{application}_out_%Y%m%d
# Flume在HDFS文件夹下创建新文件的后缀
a1.sinks.k1.hdfs.fileSuffix=.log
# assemble
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1
4、启动服务
# 进入到bin目录下
cd {FLUME_HOME}/bin
# -n 配置文件中agent的别名
# -c 配置目录路径
# -f 配置文件路径
./flume-ng agent -n a1 -c ../conf -f ../conf/script-hdfs.conf.properties -Dflume.root.logger=INFO,console
5、测试
执行程序:
上述配置会将日志输出到 hdfs 中的 /flume/mylogs/demo 路径下,配置了文件名的前缀后缀并取消写文件时的后缀,没有配置滚动规则,非活动文件的超时时间为5秒,也就是执行时只有一个文件,但如果flume在5秒后没有监控到日志变化就关闭当前文件,开始创建写入到下一文件。
可以在浏览器或命令行进行查看:
[root@node1 flume]# hadoop fs -ls /flume/mylogs/demo
Found 1 item
-rw-r--r-- 3 root hdfs 63957 2021-10-12 16:18 /flume/mylogs/demo/demo_out_20211012.1634026775988.log