现在我正在一个项目中工作,我们正在尝试使用flume读取tomcat访问日志,并在spark中处理这些数据,并以适当的格式将这些数据转储到db中。但问题是tomcat访问日志文件是一个每天滚动的文件,文件名每天都会改变。比如说。。。
localhost_access_log.2017-09-19.txt
localhost_access_log.2017-09-18.txt
localhost_access_log.2017-09-17.txt
源代码部分的flume conf文件
# Describe/configure the source
flumePullAgent.sources.nc1.type = exec
flumePullAgent.sources.nc1.command = tail -F /tomcatLog/localhost_access_log.2017-09-17.txt
# flumePullAgent.sources.nc1.selector.type = replicating
它在一个固定的文件名上运行tail命令(我使用的是固定名称,仅用于测试)。如何在flume conf文件中将文件名作为参数传递。
其实,如果我怎么能把一些文件名作为参数传递,那么也不会是一个实际的解决方案。比方说,我今天用一些文件名(例如:“localhost\u access\u log.2017-09-19.txt”)启动flume,明天我将更改文件名(localhost\u access\u log.2017-09-19.txt到localhost\u access\u log.2017-09-20.txt),有人必须停止flume并用新的文件名重新启动。在这种情况下,这将不是一个持续的过程,我必须停止/启动Flume使用cron作业或类似的东西。另一个问题是,在处理期间,我每天都会丢失一些数据(我们现在使用的服务器是高通量服务器,几乎是700-800 tps)。(我的意思是生成新文件名所需的时间+停止flume的时间+启动flule的时间)
任何一个,你知道如何在生产环境中运行文件名为roll-over的flume吗?我们将非常感谢您的帮助。。。
1条答案
按热度按时间o7jaxewo1#
exec
源代码不适合您的任务,您可以改用假脱机目录源代码。从flume用户指南:此源允许您通过将要接收的文件放入磁盘上的“假脱机”目录来接收数据。此源代码将监视指定目录中的新文件,并在新文件出现时解析其中的事件。
然后,在配置文件中,您会像这样提到您的日志目录:
agent.sources.spooling_src.spoolDir = /tomcatLog