flume误读压缩文件

背景

公司一直用flume读取模块日志,来进行下一步处理,flume出现了两个配置问题:
1、flume的traceFile目录放在了srcdir下,也就是flume自己的tracelog放在了要读取的模块日志目录下,所以会重复读取日志
2、上述两份日志每天被清理脚本压缩一遍,导致已经被flume读取过的日志,压缩之后又被读取了一次,并且由于已经压缩,flume读取到的是乱码

gpt给出了自己的回答,可借鉴参考:

GPT的回答

flume会读取子目录下的文件吗

是的,Flume可以读取子目录下的文件。

Flume提供了一个称为Spooling Directory Source的源,它允许您监视包含要收集的文件的目录。 这个源可以递归地检查目录及其子目录中的所有文件,并将它们发送到Flume通道进行处理。在配置Flume时,只需将该目录的路径指定为Spooling Directory Source的选项即可。

以下是示例配置,演示如何使用Spooling Directory Source收集指定目录及其所有子目录中的文件:

agent.sources = spoolDir
agent.channels = memoryChannel
agent.sinks = loggerSink

agent.sources.spoolDir.type = spooldir
agent.sources.spoolDir.spoolDir = /path/to/directory
agent.sources.spoolDir.recursiveDirectorySearch = true

agent.channels.memoryChannel.type = memory

agent.sinks.loggerSink.type = logger
agent.sinks.loggerSink.channel = memoryChannel

在这里,spoolDir是我们给Spooling Directory Source命名的标识符。 spoolDir.spoolDir属性设置要监视的目录的路径。 spoolDir.recursiveDirectorySearch属性告诉Flume是否应递归地搜索该目录的子目录。

通过使用此配置,Flume将从指定的目录及其所有子目录中收集所有文件,并将它们写入指定的日志输出目标。

flume 如何判断文件是否被读取过

Flume使用了一个称为“状态”(state)的机制来跟踪已经成功接收并处理过的事件。 对于Spooling Directory Source,Flume会在特定位置存储一个元数据文件,用于保留上一次读取到的文件的位置信息,以便下一次从上一次结束的地方继续读取。 当Flume处理完一个文件时,它会将该文件的元数据信息添加到状态中。

因此,Flume可以根据状态文件轻松判断文件是否已经被读取过。 如果一个文件已经被读取过,元数据信息就会被更新,如果该文件是新文件或者之前读取过但又被修改了,那么Flume就会重新读取整个文件。

您可以在Flume配置文件中设置状态文件的位置。 下面是示例配置:

agent.sources = spoolDir
agent.channels = memoryChannel
agent.sinks = loggerSink

agent.sources.spoolDir.type = spooldir
agent.sources.spoolDir.spoolDir = /path/to/directory
agent.sources.spoolDir.recursiveDirectorySearch = true
agent.sources.spoolDir.fileHeader = true
agent.sources.spoolDir.basenameHeader = true
agent.sources.spoolDir.ignorePattern = ^\.
agent.sources.spoolDir.deserializer.maxLineLength = 1024
agent.sources.spoolDir.deserializer.charset = UTF-8
agent.sources.spoolDir.deletePolicy = immediate
agent.sources.spoolDir.byteOffsetHeader = true
agent.sources.spoolDir.interceptors = i1
agent.sources.spoolDir.interceptors.i1.type = static
agent.sources.spoolDir.interceptors.i1.key = dataType
agent.sources.spoolDir.interceptors.i1.value = log
agent.channels.memoryChannel.type = memory
agent.sinks.loggerSink.type = logger
agent.sinks.loggerSink.channel = memoryChannel

# Set the directory for the state file
agent.sources.spoolDir.spoolDir = /path/to/directory

# Set the name of the state file
agent.sources.spoolDir.fileHeader = true
agent.sources.spoolDir.basenameHeader = true
agent.sources.spoolDir.deserializer.maxLineLength = 1024
agent.sources.spoolDir.deserializer.charset = UTF-8

# Set the polling interval to 5 seconds
agent.sources.spoolDir.pollDelay = 5000

在这里,spoolDir源的配置包括状态文件的位置和名称。 spoolDir.fileHeader和spoolDir.basenameHeader属性指示Flume在元数据文件中保存文件名和路径,以便在下次启动时能够正确地恢复状态。 pollDelay属性指定了Spooling Directory Source每次检查目录的时间间隔,单位为毫秒。

flume已经读取的文件,被重新压缩,flume是否会重新读取该文件

如果已经被Flume读取的文件被重新压缩,那么Flume会将其视为一个新文件,并尝试再次读取。这是因为在重新压缩后,该文件的内容和元数据信息都已经改变了,因此Flume不能将其识别为先前已经读取过的同一文件。

如果您希望防止这种情况发生,可以使用ignorePattern属性来排除不需要监控的文件类型,例如:.gz或.zip等已经被压缩的文件。 在Flume的Spooling Directory Source配置中,设置ignorePattern属性忽略特定文件类型,如下所示:

agent.sources = spoolDir
agent.channels = memoryChannel
agent.sinks = loggerSink

agent.sources.spoolDir.type = spooldir
agent.sources.spoolDir.spoolDir = /path/to/directory
agent.sources.spoolDir.recursiveDirectorySearch = true
agent.sources.spoolDir.ignorePattern = \.gz$

# other configuration options...
agent.channels.memoryChannel.type = memory
agent.sinks.loggerSink.type = logger
agent.sinks.loggerSink.channel = memoryChannel

在这里,spoolDir.ignorePattern属性设置为\ .gz $,这将导致Flume忽略所有扩展名为.gz的文件。 您可以根据需要添加其他要忽略的模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值