如何在Spring Boot应用程序中使用Apache Tailer?

2019年8月12日 23点热度 0条评论

主要问题

我正在编写一个应用程序(available here on GitHub-下面的构建/运行说明),该应用程序会抓取日志文件,并对写入日志的某些事件做出反应(在这种情况下,向REST API发出HTTP请求)。我选择了Java,Spring Boot 2.x,Apache TailerOpenFeign作为实现此目的的主要工具。

我怀疑我不了解Apache Tailer及其在后台的线程功能,或者如何在Spring Boot应用程序中正确利用它。在Spring Boot应用程序的上下文中初始化和运行Tailer的正确方法是什么?

附加信息

为了测试这一点,我在本地启动应用程序,并通过外壳将文本行回显到给定的日志文件中。
在撰写本文时(commit 1fed906),当我运行应用程序时,似乎:

拖尾初始化(我可以看到在构造它的TailerListenerAdapter.init()上调用了TailerListenerAdapter
拖尾程序运行(我看到的所有内容都写入了它观看的日志文件中,并传递给了TailerListenerAdapter.handle())。

一旦我在TailerListenerAdapter知道应该对它进行响应的日志中写入内容,就好像控件从Tailer.run()方法调用退出,应用程序退出(正常)。我希望它继续运行并跟踪日志,直到我停止应用程序为止。

我不确定在这种情况下在哪里调用Tailer.run(),所以我将其放在自定义的Tailer子类的@PostConstruct方法中。我以前从未使用过@PostConstruct,所以我不能100%地确定我是否正确使用了它,或者是否有更好的放置位置来确保run()在启动时被调用,同时还允许我将我所有的配置文件/ Bean驱动选项注入其中。

生成/运行说明

克隆project
在shell中运行:
mvn spring-boot:run -Dspring-boot.run.arguments=--tailer.logFile=/path/to/any/test.log,--logging.level.com.github.ubunfu.mclogbot=DEBUG

要么

在IDE中设置等效的运行配置。有一个application-local.yml Spring Boot配置文件,其中有一个地方可以指定测试日志文件的路径。在IntelliJ中,使用Command Line中的以下内容设置Maven运行配置:spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=local

解决方案如下:

我现在很确定,在Spring Boot应用程序中运行Tailer的正确方法是修改主类以实现CommandLineRunner(如本小巧的Mkyong article中所述),然后运行Tailer从那里。我相信这是因为Spring Boot假设您正在编写一个Web应用程序,其中入口点是由Tomcat或其他东西处理的入站请求。如果您想更改入口点(例如,它不是Web应用程序),则可以执行上述操作,并从本质上覆盖默认行为。

我仍然不完全了解这种奇怪的行为,在我第一次写日志消息时,应用程序应该对Tailer做出反应(而不是忽略),并且该应用程序似乎正常停止了。但是,我相信我已经修复了它,所以我会分享。

在此应用程序中,我一直指的是“响应”特定日志消息的行为是:

解析日志消息
建立一个HTTP请求
使用Feign客户端将其发送到REST API

以前,我一直在忽略Feign客户端的响应-甚至没有将其分配给Response对象。当我决定尝试查看API实际返回的内容时,该应用程序的行为发生了变化,以至于它在第一次调用后不再自行退出。我可以继续编写消息,并且会不断访问API。

这是一个link to the PR,我确定可以更改它。

我希望这对其他人有帮助!