背景
公司一直用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的文件。 您可以根据需要添加其他要忽略的模式。