Dieser Artikel stellt Ihnen hauptsächlich die Methode der Echtzeitüberwachung und Ausgabe von Protokolldateien in Java vor. Der Artikel stellt sie ausführlich anhand von Beispielcode vor, der für jeden, der ihn benötigt, einen gewissen Referenz- und Lernwert hat der Herausgeber. Studieren und studieren.
Vorwort
Kürzlich gibt es ein System zum Bleichen von Bankdaten, bei dem der Bediener die Shell des Remote-Linux-Servers auf der Seite aufrufen muss und Ausgabe der Shell Die Informationen werden in einer Protokolldatei gespeichert und die Front-End-Seite sollte den Inhalt der Protokolldatei in Echtzeit anzeigen. Die Schwierigkeit bei diesem Problem besteht darin, zu beurteilen, welche Daten neu hinzugefügt sind . Durch Anzeigen des JDK-Hilfedokuments
java.io.RandomAccessFile
Um dieses Problem zu simulieren, schreiben Sie die Klassen LogSvr und LogView kontinuierlich in die Protokolldatei „mock.log“. LogView gibt die Daten des geänderten Teils des Protokolls in Echtzeit aus.
Code 1: Protokollgenerierungsklasse
package com.bill99.seashell.domain.svr; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** *<p>title: 日志服务器</p> *<p>Description: 模拟日志服务器</p> *<p>CopyRight: CopyRight (c) 2010</p> *<p>Company: 99bill.com</p> *<p>Create date: 2010-6-18</P> *@author Tank Zhang<tank.zhang@99bill.com> *@version v0.1 2010-6-18 */ public class LogSvr { private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 将信息记录到日志文件 * @param logFile 日志文件 * @param mesInfo 信息 * @throws IOException */ public void logMsg(File logFile,String mesInfo) throws IOException{ if(logFile == null) { throw new IllegalStateException("logFile can not be null!"); } Writer txtWriter = new FileWriter(logFile,true); txtWriter.write(dateFormat.format(new Date()) +"\t"+mesInfo+"\n"); txtWriter.flush(); } public static void main(String[] args) throws Exception{ final LogSvr logSvr = new LogSvr(); final File tmpLogFile = new File("mock.log"); if(!tmpLogFile.exists()) { tmpLogFile.createNewFile(); } //启动一个线程每5秒钟向日志文件写一次数据 ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); exec.scheduleWithFixedDelay(new Runnable(){ public void run() { try { logSvr.logMsg(tmpLogFile, " 99bill test !"); } catch (IOException e) { throw new RuntimeException(e); } } }, 0, 5, TimeUnit.SECONDS); } }
Code 2: Protokollanzeigeklasse
package com.bill99.seashell.domain.client; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class LogView { private long lastTimeFileSize = 0; //上次文件大小 /** * 实时输出日志信息 * @param logFile 日志文件 * @throws IOException */ public void realtimeShowLog(File logFile) throws IOException{ //指定文件可读可写 final RandomAccessFile randomFile = new RandomAccessFile(logFile,"rw"); //启动一个线程每10秒钟读取新增的日志信息 ScheduledExecutorService exec = Executors.newScheduledThreadPool(1); exec.scheduleWithFixedDelay(new Runnable(){ public void run() { try { //获得变化部分的 randomFile.seek(lastTimeFileSize); String tmp = ""; while( (tmp = randomFile.readLine())!= null) { System.out.println(new String(tmp.getBytes("ISO8859-1"))); } lastTimeFileSize = randomFile.length(); } catch (IOException e) { throw new RuntimeException(e); } } }, 0, 1, TimeUnit.SECONDS); } public static void main(String[] args) throws Exception { LogView view = new LogView(); final File tmpLogFile = new File("mock.log"); view.realtimeShowLog(tmpLogFile); } }
Führen Sie die LogSvr-Klasse aus und schreiben Sie Daten in die Protokolldatei „mock.log“. alle 5 Sekunden. Führen Sie dann die LogView-Klasse aus und lesen Sie sie alle 1 Sekunde. Geben Sie dann den geänderten Teil aus.
PS:
2010-06-19 17:25:54 99bill test ! 2010-06-19 17:25:59 99bill test ! 2010-06-19 17:26:04 99bill test ! 2010-06-19 17:26:09 99bill test ! 2010-06-19 17:26:14 99bill test ! 2010-06-19 17:26:19 99bill test !
Ein Freund hat meinen Code heruntergeladen und gesagt, dass er verstümmelt wird, wenn er geändert wird Der Code in Zeile 30 der Protokollausgabeklasse bis
wird normal angezeigt
System.out.println(tmp)
System.out.println(new String(tmp.getBytes("ISO8859-1")))
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Methodenbeispielen zur Echtzeitüberwachung und Ausgabe von Protokolldateien in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!