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檔案重新命名,發現依舊可以實時讀。
原文地址: https://www.linuxprobe.com/java-read-log.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2677892/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Golang 快速讀取處理大日誌檔案工具Golang
- Java 讀取檔案Java
- java專案日誌配置檔案Java
- java中讀取配置檔案Java
- Java系列:讀取XML檔案JavaXML
- Java讀取Json檔案工具類JavaJSON
- 本地檔案包含之包含日誌獲取webshellWebshell
- java讀取大檔案並處理Java
- Java 讀取txt檔案生成Word文件Java
- Django實現web端tailf日誌檔案DjangoWebAI
- 【MySQL日誌】MySQL日誌檔案初級管理MySql
- java Spring讀取properties檔案的注意點JavaSpring
- Java使用commons-configuration讀取配置檔案Java
- Java讀取properties配置檔案工具包Java
- 【Django】檔案讀取時路徑問題Django
- Linux系統定時清空日誌內容和刪除日誌檔案教程。Linux
- 在Oracle中,如何定時刪除歸檔日誌檔案?Oracle
- 定時將系統時間更新在日誌檔案中
- Java中的獲取檔案的物理絕對路徑,和讀取檔案Java
- go開發屬於自己的日誌庫-檔案日誌庫實現Go
- 任意檔案讀取
- 日誌檔案過大清理
- sybase iq日誌檔案管理
- MySQL InnoDB日誌檔案配置MySql
- java檔案相關(檔案追加內容、檔案內容清空、檔案內容讀取)Java
- Java讀取properties檔案連線資料庫Java資料庫
- Java讀取本地檔案內容並輸出Java
- Java動態指令碼Groovy讀取配置檔案Java指令碼
- go 開發屬於自己的日誌庫-檔案日誌庫原型實現Go原型
- Linux 使用 crontab 定時拆分日誌、清理過期檔案Linux
- @PropertySource 註解實現讀取 yml 檔案
- Python實用方法之讀取本地檔案Python
- dataWarehouseOss專案總結(二)_讀取日誌資訊寫入kafkaKafka
- CDN日誌實時分析
- go配置檔案讀取Go
- python讀取大檔案Python
- springboot讀取配置檔案Spring Boot
- 用友任意檔案讀取