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
posted @ 2021-10-12 18:01  Leil_blogs  阅读(373)  评论(0编辑  收藏  举报