Java實時讀取日誌檔案
在實習的公司碰到一個古怪的需求:在一臺伺服器上寫日誌檔案,每當日誌檔案寫到一定大小時,比如是1G,會將這個日誌檔案改名成另一個名字,並新建一個與原檔名相同的日誌檔案,再往這個新建的日誌檔案裡寫資料;要求寫一個程式能實時地讀取日誌檔案中的內容,並且不能影響寫操作與重新命名操作。
RandomAccessFile類中seek方法可以從指定位置讀取檔案,可以用來實現檔案實時讀取。 |
編碼實現
寫日誌檔案,每秒寫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檔案重新命名,發現依舊可以實時讀。
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2677892/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用外部表讀取告警日誌檔案
- Golang 快速讀取處理大日誌檔案工具Golang
- Java 讀取檔案Java
- java專案日誌配置檔案Java
- 使用外部表讀日誌檔案
- JAVA 讀取xml檔案JavaXML
- java讀取properties檔案Java
- java 讀取.txt檔案時,注意的問題Java
- Java系列:讀取XML檔案JavaXML
- java中讀取配置檔案Java
- Java高效讀取大檔案Java
- 網際網路金融專案——工作日誌(六)玩轉檔案讀取
- 【Oracle日誌】- 日誌檔案重建Oracle
- 日誌檔案
- 日誌檔案和歸檔日誌檔案的關係以及如何切換日誌
- java中讀取.properties配置檔案Java
- Java屬性檔案的讀取Java
- Java讀取大檔案的高效率實現Java
- 本地檔案包含之包含日誌獲取webshellWebshell
- Java 日誌快取機制的實現Java快取
- 刪除日誌檔案組與日誌檔案成員
- 管理日誌檔案
- dump日誌檔案
- APACHE日誌檔案Apache
- java讀取大檔案並處理Java
- Java 讀取txt檔案生成Word文件Java
- Java讀取Json檔案工具類JavaJSON
- Java讀取多層級xml檔案JavaXML
- Java API 讀取HDFS的單檔案JavaAPI
- java讀取resouces目錄下檔案Java
- java讀取大檔案1G+Java
- java mysql儲存和讀取檔案JavaMySql
- 控制檔案/歸檔日誌
- 增加日誌檔案,修改當前日誌檔案大小
- LNAV:基於 Ncurses 的日誌檔案閱讀器
- 如何實時讀取一個不斷更新的文字檔案
- 對日誌檔案組和日誌檔案組成員的管理
- 【Django】檔案讀取時路徑問題Django