簡體   English   中英

如何在 Spring 引導應用程序中使用 Apache Tailer?

[英]How do I use Apache Tailer within a Spring Boot App?

主要問題

我正在編寫一個應用程序( 在 GitHub 上可用- 下面的構建/運行說明),它會抓取日志文件並對寫入日志的某些事件做出反應(在這種情況下,向 Z50780F47F6839D047D60BC435E 發出 HTTP 請求)。 為此,我選擇了 Java、Spring Boot 2.x、 Apache TailerOpenFeign作為主要工具。

我懷疑我不了解 Apache Tailer 及其在后台執行的線程如何工作,或者如何在 Spring 引導應用程序中正確利用它。 在 Spring Boot 應用程序的上下文中初始化和運行Tailer的正確方法是什么?

附加信息

為了測試這一點,我在本地啟動應用程序,並通過 shell 將文本行回顯到給定的日志文件中。 在撰寫本文時(提交1fed906 ),當我運行該應用程序時,似乎:

  1. Tailer 初始化(我可以看到TailerListenerAdapter.init()在我構建的TailerListenerAdapter上被調用)

  2. Tailer 運行(我看到我寫到它監視的日志文件中的所有內容都傳遞給TailerListenerAdapter.handle() )。

一旦我在日志中寫了一些東西,我的 TailerListenerAdapter 知道它應該做出反應,它看起來就像控制從Tailer.run()方法調用中退出,並且應用程序退出(優雅地)。 我希望它繼續運行並跟蹤日志,直到我停止應用程序。

我不確定在這種情況下在哪里調用Tailer.run() ,所以我將它放在自定義 Tailer 子類的@PostConstruct方法中。 我以前從未使用過@PostConstruct ,所以我不能 100% 確定我是否正確使用它,或者是否有更好的地方放置它以確保run()在啟動時被調用,同時還允許我注入我所有的配置文件/ bean 驅動選項都放入其中。

構建/運行說明

  1. 克隆項目
  2. Run this in a 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 引導配置文件,其中包含指定測試日志文件路徑的位置。 在 IntelliJ 中,在Command Line中使用以下命令設置 Maven 運行配置: spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=local

我現在很確定在 Spring 引導應用程序中運行Tailer的正確方法是修改主 class 以實現CommandLineRunner (如這篇漂亮的Mkyong 小文章中所述),然后從那里運行Tailer 我相信這是因為 Spring 啟動假定您正在編寫 web 應用程序,其中入口點是由 Tomcat 或其他東西處理的入站請求。 如果您想更改入口點(例如,它不是 web 應用程序),您將執行上述操作並基本上覆蓋默認行為。

此外,我遇到了一個問題,即應用程序在讀取應該導致 Feign 客戶端進行 API 調用的行后會意外停止。 事實證明,原因是 Feign 客戶端拋出了一個我沒有處理的RuntimeException 由於沒有堆棧跟蹤或任何東西,因此沒有立即明顯發生任何異常。 我懷疑這是因為 Tailer 在另一個線程中運行? 我不太確定。 重點是 - 當您使用 Tailer 時要注意這一點!

我希望這對某人有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM