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

目录
  • 项目需求
  • Apache Commons-IO
  • 核心知识
  • 代码实现
  • 总结

项目需求

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

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,就可以实现对文件系统的事件监听。
  • 整体流程:
  • 自定义文件监听类并继承 FileAlterationListenerAdaptor 实现对文件与目录的创建,修改,删除事件的处理
  • 自定义文件监控类,通过指定目录创建一个观察者 FileAlterationObserver
  • 向此监视器添加文件系统观察器,并添加文件监听器
  • 通过 ApplicationRunner 或者 CommandLineRunner 调用并执行

代码实现

  • 文件监听类:
/**
 * 文件监听类
 * @author Greenarrow
 * @date 2022-05-12 14:43
 **/
public class FileListener extends FileAlterationListenerAdaptor {

    private static Logger logger = LoggerFactory.getLogger(FileListener.class);
    @Override
    public void onStart(FileAlterationObserver observer) {
        super.onStart(observer);
        logger.info("onStart");
    }

    @Override
    public void onDirectoryCreate(File directory) {
        logger.info("[新建]:" + directory.getAbsolutePath());
    }

    @Override
    public void onDirectoryChange(File directory) {
        logger.info("[修改]:" + directory.getAbsolutePath());
    }

    @Override
    public void onDirectoryDelete(File directory) {
        logger.info("[删除]:" + directory.getAbsolutePath());
    }

    @Override
    public 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);
        }
    }

    @Override
    public void onFileChange(File file) {
        String compressedPath = file.getAbsolutePath();
        logger.info("[修改]:" + compressedPath);
    }

    @Override
    public void onFileDelete(File file) {
        logger.info("[删除]:" + file.getAbsolutePath());
    }

    @Override
    public 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;

    @Override
    public 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实现日志文件监听并读取相关数据的方法实践的文章就介绍到这了,更多相关Java 日志文件监听读取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java异步写日志到文件中实现代码

    java异步写日志到文件中详解 实现代码: package com.tydic.ESUtil; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.Properties; public class LogWriter { // 日志的配置文件 publi

  • Java实时监控日志文件并输出的方法详解

    前言 最近有一个银行数据漂白系统,要求操作人员在页面调用远端Linux服务器的shell,并将shell输出的信息保存到一个日志文件,前台页面要实时显示日志文件的内容.这个问题难点在于如何判断哪些数据是新增加的,通过查看JDK 的帮助文档, java.io.RandomAccessFile可以解决这个问题.为了模拟这个问题,编写LogSvr和 LogView类,LogSvr不断向mock.log日志文件写数据,而 LogView则实时输出日志变化部分的数据. 代码1:日志产生类 package

  • Java中重定向输出流实现用文件记录程序日志

    System中的out,error都是final类型的,不能做改动.但通过setOut()可以设置新的输出流,从而实现写日志的功能. import java.io.PrintStream; import java.io.FileNotFoundException; public class RedirectOutputStream { public static void main(String arg[]){ try{ PrintStream out = System.out; //保留原输出

  • Java 配置log4j日志文件路径 (附-获取当前类路径的多种操作)

    1 日志路径带来的痛点 Java 项目中少不了要和log4j等日志框架打交道, 开发环境和生产环境下日志文件的输出路径总是不一致, 设置为绝对路径的方式缺少了灵活性, 每次变更项目路径都要修改文件, 目前想到的最佳实现方式是: 根据项目位置自动加载并配置文件路径. 本文借鉴 Tomcat 的配置方式 "${catalina.home}/logs/catalina.out", 通过相对路径的方式设置日志的输出路径, 有其他解决方案的小伙伴, 请直接评论区交流哦

  • java自定义日志输出文件(log4j日志文件输出多个自定义日志文件)

    log4j输出多个自定义日志文件 如果在实际应用中需要输出独立的日志文件,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢? 先看一个常见的log4j.properties文件,它是在控制台和test.log文件中记录日志: 复制代码 代码如下: log4j.rootLogger=DEBUG, stdout, logfile log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layo

  • Java实现日志文件监听并读取相关数据的方法实践

    目录 项目需求 Apache Commons-IO 核心知识 代码实现 总结 项目需求 由于所在数据中台项目组需要实现监听文件夹或者日志文件并读取对应格式的脏数据的需求,以便在文件.文件夹发生变化时进行相应的业务流程:所以在这里记录下相关业务的实现及技术选型. Apache Commons-IO 首先需要添加对应依赖: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</

  • Python写一个基于MD5的文件监听程序

    前述 写了一个基于MD5算法的文件监听程序,通过不同的文件能够生成不同的哈希函数,来实现实现判断文件夹中的文件的增加.修改.删除和过滤含有特定字符的文件名的文件. 需求说明 需要实现对一个文件夹下的文件的增加.修改和删除的监控, 一旦发生上述操作,则进行提示.可以选择过滤掉文件名中的特定字符和只监听文件名中含有特定字符的文件. 简述 首先,关于文件的增加.修改.删除的反馈,可以想到利用MD5等类似的加密算法,因为文件本身可以生成哈希值,只要文件内容或者文件名被修改过,就会生成和修改之前的哈希值不

  • java GUI编程之监听操作实例分析

    本文实例讲述了java GUI编程之监听操作.分享给大家供大家参考,具体如下: 当点击Frame中的component组件时,会产生相应的效果,但是相应的其必须进行监听,确定是那个对象,那种操作,但是如果用cup进行主动的监听就会消耗大量的资源,所以有了被动的监听,即对应的事件发生后会自动的执行相关的代码. Button监听: instance 1: import java.awt.*; import java.awt.event.*; public class MoniterStart { p

  • 详谈Java中的事件监听机制

    鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动作发生在哪个组件上,那么该组件就是事件源对象 2.事件监听方法: addMouseListener(MouseListener ml) ;该方法主要用来捕获鼠标的释放,按下,点击,进入和离开的动作:捕获到相应的动作后,交由事件处理类(实现MouseListener接口)进行处理. addAction

  • java中使用session监听实现同帐号登录限制、登录人数限制

    本文主要介绍了java中使用session监听实现同帐号登录限制.登录人数限制,具体代码如下: 问题域: 1.同帐号登录:若此帐号已登录,不可再次登录(与QQ模式相反). 2.登录人数限制,超过.已达人数限制则提示:系统繁忙,稍后再试. 解决思路:使用HttpSessionAttributeListener监听器(虽然我同时使用了HttpSessionListener不过感觉不好操作) 知识储备:HttpSessionAttributeListener中有attributeAdd.attribu

  • Android创建文件实现对文件监听示例

    复制代码 代码如下: public class FileObserverTest extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyFileObserver mfo = new MyFileObserver(getApplicationContext().getFilesDir() + "/data.txt"

  • npm script 的文件监听和自动刷新的命令详解

    文件监听的作用是为了实现自动化,释放双手和精力,提高效率,让开发者更加关注于开发.npm script 文件监听和 grunt.gulp 功能类似. 自动刷新,意思就是改动文件保存后,页面自动刷新,减少日常开发的操作. 代码检查的监听和自动化 代码检查工具 stylelint.eslint.jsonlint 这些对 watch 支持很弱,所以就需要引入工具包 onchange 安装命令依赖包 npm i onchange -D // 或 yarn add onchange -D 编写命令 "sc

  • 详解webpack的文件监听实现(热更新)

    前言 文件监听是在源码发生变化时,自动重新构建出新的输出文件. webpack 开启监听模式,有两种方式: 1.启动 webpack 命令时,带上 --watch 参数.  唯一缺点:需要手动刷新才能看到变化: 2.在配置 webpack.config.js 中设置 watch: true.  优点: (1) WDS 不刷新浏览器 (2) WDS 不输出文件,⽽是放在内存中 (3) 使⽤用 HotModuleReplacementPlugin 插件 1 第一种方式, --watch 1.1 配置

  • Android编程监听网络连接状态改变的方法

    本文实例讲述了Android编程监听网络连接状态改变的方法.分享给大家供大家参考,具体如下: BroadcastReceiver public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub //Toast.makeText(context, intent

  • Oracle设置DB、监听和EM开机启动的方法

    一.Windows系统 Oracle提供了随操作系统启动而启动的功能,在Windows和Linux中,分别有不同的设置方法. 在Windows中,可以修改"我的电脑-->管理-->服务-->OracleService$ORACLE_SID",或直接使用Win+R键打开运行窗口,输入services.msc即可打开服务,找到相应的Oracle服务,然后将其属性中的启动类型修改成自动.一般在Windows系统上安装完后会自动设置成自动. 二.Linux系统 对于Linux

随机推荐