实时读取日志文件

Posted zhxuxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实时读取日志文件相关的知识,希望对你有一定的参考价值。

需求:在生成日志文件的过程中,需要实时读取该日志,需要每次读取时记录一次读取的位置,下一次从该位置读取

参考:http://sunnylocus.iteye.com/blog/694666

问题:由于我是每次读取几十行日志就停止一次,如果使用上面连接的代码RandomAccessFile.length()记录文件位置,发现记录的位置远大于读取的位置,这样为导致丢失一部分信息

方法1:因为日志是一直在写,一开始从0开始,可以先记录一下当前读取位置的的指针,下一次开始读的时候从该处再次读取

 方法1需要用到以下内容:

randomAccessFile.getFilePointer()   

此方法返回从文件开始的偏移量,以字节为单位,当前位置的偏移量

randomAccessFile.readLine()

方法从这个文件读取文本的下一行。该方法依次从文件中读取的字节处开始,从当前文件指针,直到它到达一个行结束或在文件的结尾。每个字节是通过采取字节的值的低8位的字符,并设置高8位字符的零转换成一个字符。

RandomAccessFile.seek()

偏移位置,以字节为单位从文件的开头计量,在其上设置文件指针。

RandomAccessFile.length()

此方法返回当前文件的长度,以字节为单位。

 

   File logFile = new File("D:\workspace\drawChart\src\read_log\log.txt");
   private long lastTimeFileSize = 0; // 上次文件大小

 protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
        //获取保存的上一次读取的位置
        String str = request.getParameter("lastTimeFileSize");        
        lastTimeFileSize = Long.parseLong(str);
        System.out.println(lastTimeFileSize);          
                 
        try {
            long len = logFile.length();
            System.out.println(len);
            if(lastTimeFileSize >= len){
                lastTimeFileSize = len;
                try {
                    //如果读取的速度超过写的速度,等待5秒
                    Thread.sleep(5000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }                              
            }else{
                 RandomAccessFile randomFile = new RandomAccessFile(logFile, "r");     
                 randomFile.seek(lastTimeFileSize);                    
                 String tmp = null;                                                                 
                 while ((tmp = randomFile.readLine()) != null) {                                                                                           if(matcher0.lookingAt()){                               
                         if(flag==4){                                
                            //记录读取文件的位置
                            lastTimeFileSize = randomFile.getFilePointer();
                            System.out.println(lastTimeFileSize);
                            //保存指针
                         }                                                                      
                     }
             
        } catch (IOException e) {               
            e.printStackTrace();
        }finally{
            //其它操作            
        }         
    }  

 

 

 

方法2:记录行号 

    --如果用循环读取方法,循环会消耗资源,使系统负担太重


以上是关于实时读取日志文件的主要内容,如果未能解决你的问题,请参考以下文章

[PHP] php作为websocket的客户端实时读取推送日志文件

用java如何实现将大的日志文件分隔成小文件

websocket在前端展示后端日志

java实时监听日志写入kafka

如何实时查看linux下的日志

java实时监听日志写入kafka(多目录)