Java 实现日志文件监听并读取相关数据

项目需求

由于所在数据中台项目组需要实现监听文件夹或者日志文件并读取对应格式的脏数据的需求,以便在文件、文件夹发生变化时进行相应的业务流程;所以在这里记录下相关业务的实现及技术选型。

Apache Commons-IO

首先需要添加对应依赖:

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.7</version>
</dependency>

版本可自行选择,这里需要注意的是 2.7 版本及以上需要 Java 8

官网截图:

Apache Commos IO中的 org.apache.commons.io.monitor包提供了文件系统监听的功能。

核心知识

  • 一句话总结:通过观察者模式以及事件监听机制,以 FileAlterationObserver 为核心,再通过 FileAlterationListenerFileAlterationMonitor,就可以实现对文件系统的事件监听。

  • 整体流程:

  1. 自定义文件监听类并继承 FileAlterationListenerAdaptor 实现对文件与目录的创建,修改,删除事件的处理
  2. 自定义文件监控类,通过指定目录创建一个观察者 FileAlterationObserver
  3. 向此监视器添加文件系统观察器,并添加文件监听器
  4. 通过 ApplicationRunner 或者 CommandLineRunner 调用并执行

代码实现

  • 文件监听类:
/*** 文件监听类* @author Greenarrow* @date 2022-05-12 14:43**/
public class FileListener extends FileAlterationListenerAdaptor {private static Logger logger = LoggerFactory.getLogger(FileListener.class);@Overridepublic void onStart(FileAlterationObserver observer) {super.onStart(observer);logger.info("onStart");}@Overridepublic void onDirectoryCreate(File directory) {logger.info("[新建]:" + directory.getAbsolutePath());}@Overridepublic void onDirectoryChange(File directory) {logger.info("[修改]:" + directory.getAbsolutePath());}@Overridepublic void onDirectoryDelete(File directory) {logger.info("[删除]:" + directory.getAbsolutePath());}@Overridepublic void onFileCreate(File file) {String compressedPath = file.getAbsolutePath();logger.info("[新建]:" + compressedPath);List<String> contentList = null;try {if (file.canRead()){// 将文件按行读取为字符串集合contentList = FileUtils.readLines(new File(compressedPath), StandardCharsets.UTF_8);if (CollectionUtil.isNotEmpty(contentList)){// 获取对应格式的数据并输出,这里可自行添加业务处理List<String> dirtyRecord  = contentList.stream().filter(s -> s.startsWith("{") && s.endsWith("}")).collect(Collectors.toList());dirtyRecord.forEach(System.out::println);}}} catch (IOException e) {e.printStackTrace();logger.error("读取文件内容失败",e);}}@Overridepublic void onFileChange(File file) {String compressedPath = file.getAbsolutePath();logger.info("[修改]:" + compressedPath);}@Overridepublic void onFileDelete(File file) {logger.info("[删除]:" + file.getAbsolutePath());}@Overridepublic void onStop(FileAlterationObserver observer) {super.onStop(observer);logger.info("onStop");}
}
  • 文件监控类:
/*** 文件监听测试 demo* @author Greenarrow* @date 2022-05-12 14:45**/
public class FileMonitor {FileAlterationMonitor monitor = null;public FileMonitor(long interval) throws Exception {monitor = new FileAlterationMonitor(interval);}/*** 给文件添加监听* @param path* @param listener*/public void monitor(String path, FileAlterationListener listener) {FileAlterationObserver observer = new FileAlterationObserver(new File(path));monitor.addObserver(observer);observer.addListener(listener);}public void stop() throws Exception {monitor.stop();}public void start() throws Exception {monitor.start();}
}
  • 自定义 Runner 并实现 CommandLineRunner :
/*** 项目启动之后开启文件监听功能* @author Greenarrow* @date 2022-05-12 10:02**/
@Component
// @Order(Integer.MIN_VALUE)
public class DirtyRecordRunner implements CommandLineRunner {private static Logger logger = LoggerFactory.getLogger(DirtyRecordRunner.class);@Value("${test}")private String path;@Overridepublic void run(String... args) throws Exception {logger.info(this.getClass().getName()+"[开启文件夹监听功能]");FileMonitor fileMonitor = new FileMonitor(1000);fileMonitor.monitor(path,new FileListener());fileMonitor.start();}
}

总结

  • 文件、文件夹监听功能较简单,实现方式可自行选择
  • 需要注意的是,通过 Runner 的方式在项目启动之后开启相关监听功能,此方式存在缺陷,只能调用一次,出现异常就会停止,除非项目重启,这里需要通过相关补偿机制来实现

Java 实现日志文件监听并读取相关数据相关推荐

  1. oracle启动监听读取哪个文件,监听服务启动及数据文件恢复oracle数据库

    最近遭遇了 oralce 监听服务启动了 又自行关闭的 悲惨经历 我把我的过程和大家分享一下! 1)排查原因 程序员是懒惰的,我始终都希望能够成功启动监听服务,但是就是事与愿违 有一下方式可能不能成功 ...

  2. Java 使用Tailer类监听文件

    线程创建的三种方式:   FileDataListener listener = new FileDataListener(path,this);         //使用单线程池线程监听文件     ...

  3. java毕业设计——基于java+Winpcap的局域网监听软件设计与实现(毕业论文+程序源码)——局域网监听软件

    基于java+Winpcap的局域网监听软件设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Winpcap的局域网监听软件设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

  4. java实现全局键盘监听

    java实现全局键盘监听 Java本身是无法对桌面进行全局键盘监听的,无法设置全局快捷键,当焦点从java程序面板失去时,自带的监听器就无法监听了,但是比如一些用java写的截图程序是需要全局快捷键操 ...

  5. 【java】画图和监听事件的应用

    [java]画图和监听事件的应用 (1)frame.getContentPane().add(new Change()); ***用getContentPane()方法获得JFrame的内容面板,再对 ...

  6. common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例子》)...

    common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法<很全的监听文件例子>) 转载于:https://www.cnblogs.com/rocky ...

  7. Java Swing 键盘事件监听

    Java Swing 键盘事件监听 开发工具与关键技术:java. elipse2019.jdk1.8 作者:Amewin 撰写时间:2019年9月16日 键盘事件的事件源一般丐组件相关,当一个组件处 ...

  8. java存储音频文件及校验与读取

    java存储音频文件及校验与读取 音频存储为音频流 前端部分 后端部分 音频流转换为文件 后端读取音频流-controller 音频存储为音频流 前端部分 前端html 注意:前端使用的是Angula ...

  9. Day2多种抓包工具介绍以及使用封包监听工具找到挑战数据包实现发送数据包进行挑战

    工具相关证书安装指南 Charles https://blog.csdn.net/weixin_45459427/article/details/108393878 Fidder https://bl ...

最新文章

  1. Android:AS与Unity3D之间打包的各种坑及解决方案
  2. 如何在AngularJS中使用ng-repeat迭代键和值?
  3. 魔术方法php重定向,PHP魔术方法__get()
  4. sql2000 版本号
  5. 设置中文linux输入ubuntu,Linux_ubuntu怎么设置成中文?ubuntu中文设置图文方法,  很多朋友安装ubuntu后,发 - phpStudy...
  6. 好好学一遍JavaScript 笔记(一)
  7. Vscode使用npm安装babel
  8. 《Essential C++》笔记之return;分析
  9. leetcode - Search in Rotated Sorted Array II
  10. 微信小程序在线客服系统都有哪些功能?
  11. Python-模块和包.深入Celery之子任务及原语组式/链式/回调
  12. 006 关于大数据的本地模式环境的搭建
  13. 存储过程和函数具体的区别
  14. 中安证件识别系统介绍
  15. Hash算法及数字签名【六】
  16. 我看肖老师的《明日世界-云端计算下的程序设计需求》视频时,做的简单笔记
  17. 大脸猫:「网站优化」网站优化宝典-网站优化建议
  18. jit和jitx区别_JIT的核心思想是什么?
  19. LaTeX的一般图文混排介绍
  20. 第九课 Java基础篇——面向对象(综合案例)

热门文章

  1. 【英语竞赛】专项练习之词汇和语法
  2. 科技日新月异带来的影响
  3. 高新技术企业有什么好处
  4. 问题 C: 队形变换
  5. css !important 用法
  6. SEO | 影响网站排名的重要因素!
  7. executeupdate mysql_sql语句executeQuery和executeUpdate之间的区别
  8. TCP端口数65535的限制
  9. 『津津乐道播客』#073. 洗碗机真的好用么?
  10. 网关IP地址和IP地址的区别