1. 程式人生 > >Java實時讀取日誌檔案

Java實時讀取日誌檔案

古怪的需求

在實習的公司碰到一個古怪的需求:在一臺伺服器上寫日誌檔案,每當日誌檔案寫到一定大小時,比如是1G,會將這個日誌檔案改名成另一個名字,並新建一個與原檔名相同的日誌檔案,再往這個新建的日誌檔案裡寫資料;要求寫一個程式能實時地讀取日誌檔案中的內容,並且不能影響寫操作與重新命名操作。

RandomAccessFile類中seek方法可以從指定位置讀取檔案,可以用來實現檔案實時讀取。JDK文件對RandomAccessFile的介紹

Instances of this class support both reading and writing to a random access file. A random access file behaves like a large array of bytes stored in the file system. There is a kind of cursor, or index into the implied array, called the file pointer; input operations read bytes starting at the file pointer and advance the file pointer past the bytes read. If the random access file is created in read/write mode, then output operations are also available; output operations write bytes starting at the file pointer and advance the file pointer past the bytes written. Output operations that write past the current end of the implied array cause the array to be extended.

在每一次讀取後,close一下就不會影響重新命名操作了。

編碼實現

寫日誌檔案,每秒寫200條記錄,並且記錄寫的時間

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.SimpleDateFormat;
import java.util.Date;

public class LogReader implements Runnable {
    private File logFile = null;
    private long lastTimeFileSize = 0; // 上次檔案大小
    private static SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    public LogReader(File logFile) {
        this.logFile = logFile;
        lastTimeFileSize = logFile.length();
    }

    /**
     * 實時輸出日誌資訊
     */
    public void run() {
        while (true) {
            try {
                long len = logFile.length();
                if (len < lastTimeFileSize) {
                    System.out.println("Log file was reset. Restarting logging from start of file.");
                    lastTimeFileSize = len;
                } else if(len > lastTimeFileSize) {
                    RandomAccessFile randomFile = new RandomAccessFile(logFile, "r");
                    randomFile.seek(lastTimeFileSize);
                    String tmp = null;
                    while ((tmp = randomFile.readLine()) != null) {
                        System.out.println(dateFormat.format(new Date()) + "\t"
                                + tmp);
                    }
                    lastTimeFileSize = randomFile.length();
                    randomFile.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

實時讀取日誌檔案,每隔1秒讀一次

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.SimpleDateFormat;
import java.util.Date;

public class LogReader implements Runnable {
    private File logFile = null;
    private long lastTimeFileSize = 0; // 上次檔案大小
    private static SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    public LogReader(File logFile) {
        this.logFile = logFile;
        lastTimeFileSize = logFile.length();
    }

    /**
     * 實時輸出日誌資訊
     */
    public void run() {
        while (true) {
            try {
                RandomAccessFile randomFile = new RandomAccessFile(logFile, "r");
                randomFile.seek(lastTimeFileSize);
                String tmp = null;
                while ((tmp = randomFile.readLine()) != null) {
                    System.out.println(dateFormat.format(new Date()) + "\t"
                            + tmp);
                }
                lastTimeFileSize = randomFile.length();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

開啟寫執行緒、讀執行緒,將實時資訊列印在控制檯。

import java.io.File;

public class RunRun {
    public static void main(String[] args) {
        File logFile = new File("mock.log");
        Thread wthread = new Thread(new LogWrite(logFile));
        wthread.start();
        Thread rthread = new Thread(new LogReader(logFile));
        rthread.start();
    }
}

在讀寫的過程中,我們可以手動將mock.log檔案重新命名,發現依舊可以實時讀。

相關推薦

Java實時讀取日誌檔案

古怪的需求 在實習的公司碰到一個古怪的需求:在一臺伺服器上寫日誌檔案,每當日誌檔案寫到一定大小時,比如是1G,會將這個日誌檔案改名成另一個名字,並新建一個與原檔名相同的日誌檔案,再往這個新建的日誌檔案裡寫資料;要求寫一個程式能實時地讀取日誌檔案中的內容,並且不能影響寫操作與重新命名操作。 RandomAcce

java根據檔案遊標實時讀取日誌檔案

import java.io.File; import java.io.RandomAccessFile; /** * 實時讀取日誌檔案 * @author sun * @date 2018年4月20日 下午9:51:36 */ public class File

golang 實時讀取日誌檔案,windows版本的tail

package main import ( "flag" "fmt" "io" "os" "runtime" ) import ( "github.com/axgle/mahonia" ) type ReadFile struct { file *os.File gb

實時讀取日誌文件

class nts microsoft nal char 耗資源 連接 生成 轉換 需求:在生成日誌文件的過程中,需要實時讀取該日誌,需要每次讀取時記錄一次讀取的位置,下一次從該位置讀取 參考:http://sunnylocus.iteye.com/blog/694666

java讀取Property檔案屬性工具類

java中讀取Property配置檔案屬性工具類: import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; /** * 讀取Property配置檔

java selenium 讀取配置檔案,報錯中文亂碼

參考引自:https://blog.csdn.net/qq_27093465/article/details/70765870 根據自己問題解決: package com.property; import java.io.BufferedInputStream; import java.i

java Api 讀取HDFS檔案內容

package dao; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import java.io.*; public class HDFSApi { /** * 讀取檔案內

Java 自動讀取json檔案轉化為實體類

思路: 1 建立一個輔助類,與json檔案和轉化實體類分別建立對應關係 2 建立輔助類的註解屬性與json檔案屬性對應 3 輔助類欄位屬性與實體類相同 具體需求 json檔案 {"Main": {"TestNo": "30103182222","appliName": "大小

使用java實現讀取txt檔案,匯入到MongoDB中

1.txt檔案如下 2.建立main主類 public static void main(String[] args) {        MongoClient mongo = new MongoClient("localhost"

python3讀取日誌檔案的最後一行內容

(1)模擬建立一個日誌檔案.txt 關鍵字 日期和時間 來源 事件ID 任務類別 稽核成功 2018/9/11 12:17:15 Security-Auditing 4672 Special Logon 稽核成功

java中的日誌檔案補充點

        首先我們思考一下日誌是為了解決啥產生的,要求日誌又是怎麼樣的?        一日誌是用來除錯的,那麼就需要記錄程式當前的執行狀態和程式之前的執行狀態,那麼日誌檔案不僅要能夠輸出到控制檯還要能夠輸出到檔案,甚至能夠有郵件的形式通知開發人員。二、定位錯誤。要求

java讀取配置檔案的一些方法 getResourceAsStream 和 直接 FileInputStream 以及 配置System.getProperty("user.dir")所得的工作目錄

配置檔案位於 /src/ 下的情況已經由上述博主列出,需要的可以移步檢視,即以下幾個情況 1.路徑:src/aa.xml 2.位於src下同一個包下 3.位於src下不同包 不過本博主的專案是web專案,而配置檔案放在src檔案下容易因為快取導致更新不及時,

Java讀取XML檔案內容

下面是我的Persons.xml檔案內容: <?xml version="1.0" encoding="utf-8"?> <persons> <person id="0

(很容易理解)Java 建立/讀取配置檔案

建立/讀取配置檔案 新建一個配置檔案”config.ini”並寫入預設設定 Properties pro = new Properties(); pro.put("GuestDefaultFloor", "10"); pro.store(new BufferedOut

spark讀取日誌檔案,把RDD轉化成DataFrame

一、先開啟Hadoop和spark 略 二、啟動spark-shell spark-shell --master local[2] --jars /usr/local/src/spark-1.6.1-bin-hadoop2.6/libext/com.mysql.jdbc

Java讀取配置檔案

package utils.properties; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Concu

java快速讀取文字檔案最後一行資料內容,文字檔案非常大

http://www.iteye.com/problems/42748 public static void main(String[] args) throws Exception { File file = new File("E:/a.txt"); // 100M

java實現讀取配置檔案 (檔名、目錄名或卷標語法不正確。)

報錯:java.io.FileNotFoundException: “e:\test\2018計劃\test.mpp” (檔名、目錄名或卷標語法不正確。):一、我的程式碼片段如下:        ProjectReader reader = new MPPReader(); 

java 直接讀取zip檔案檔案內容

不解壓zip檔案,直接讀取zip包內的資料夾以及檔案內容 zip包內內容: 程式碼如下: import java.io.*; import java.nio.charset.Charset;

Java專案讀取配置檔案時,FileNotFoundException 系統找不到指定的檔案,System.getProperty("user.dir")的理解

唉,讀取個檔案,也就是在專案裡面去獲得配置檔案的目錄,然後,變成檔案,有事沒事,總是出個 FileNotFoundException  系統找不到指定的檔案,氣死人啦。 還有就是:System.getProperty("user.dir"),都說獲得的是“工作目錄”,有老鐵