Création d'un outil de lecture de log
- Ajout d'un exécutable permettant la lecture en continu d'un fichier log avec support de la rotation des fichiers.
This commit is contained in:
commit
30bda04ae3
11
.classpath
Normal file
11
.classpath
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
|
<classpathentry kind="lib" path="lib/commons-collections4-4.1.jar">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="javadoc_location" value="jar:platform:/resource/LogViewer/lib/commons-collections4-4.1-javadoc.jar!/"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
17
.project
Normal file
17
.project
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>LogViewer</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
1
bin/.gitignore
vendored
Normal file
1
bin/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/fr/
|
137
src/fr/pandacube/java/logviewer/Main.java
Normal file
137
src/fr/pandacube/java/logviewer/Main.java
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
package fr.pandacube.java.logviewer;
|
||||||
|
|
||||||
|
import java.io.EOFException;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.RandomAccessFile;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.commons.collections4.queue.CircularFifoQueue;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static final String ANSI_RESET = "\u001B[0m";
|
||||||
|
|
||||||
|
public static final String ANSI_ERASE_SCREEN = "\u001B[2J";
|
||||||
|
public static final String ANSI_CURSOR_TOP_LEFT = "\u001B[1;1H";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
if (args.length == 0) {
|
||||||
|
outln("1 argument attendu : le fichier à lire.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
File f = new File(args[0]);
|
||||||
|
|
||||||
|
if (!f.exists()) {
|
||||||
|
outln("Le fichier spécifié n'existe pas");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!f.isFile()) {
|
||||||
|
outln("Le fichier spécifié n'est pas un fichier régulier");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CircularFifoQueue<String> lineBuffer = new CircularFifoQueue<String>(100);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
|
||||||
|
RandomAccessFile reader = new RandomAccessFile(f, "r");
|
||||||
|
try {
|
||||||
|
String line;
|
||||||
|
while ((line = readUTF8LineFromFile(reader)) != null) {
|
||||||
|
lineBuffer.add(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
out(ANSI_ERASE_SCREEN+ANSI_CURSOR_TOP_LEFT);
|
||||||
|
|
||||||
|
while (!lineBuffer.isEmpty())
|
||||||
|
outln(lineBuffer.poll());
|
||||||
|
|
||||||
|
|
||||||
|
long previousLength = 0;
|
||||||
|
while(true) {
|
||||||
|
if (reader.length() < previousLength) {
|
||||||
|
reader.seek(0);
|
||||||
|
}
|
||||||
|
if ((line = readUTF8LineFromFile(reader)) != null) {
|
||||||
|
outln(line);
|
||||||
|
previousLength = reader.length();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Thread.sleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
reader.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InterruptedException e) { }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static String readUTF8LineFromFile(RandomAccessFile reader) {
|
||||||
|
List<Byte> bytes = new ArrayList<Byte>();
|
||||||
|
|
||||||
|
byte b;
|
||||||
|
try {
|
||||||
|
for (;;) {
|
||||||
|
b = reader.readByte();
|
||||||
|
if ("\n".getBytes()[0] == b)
|
||||||
|
break;
|
||||||
|
|
||||||
|
bytes.add(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (EOFException e) {
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
byte[] priBytes = new byte[bytes.size()];
|
||||||
|
for (int i=0; i<bytes.size(); i++)
|
||||||
|
priBytes[i] = bytes.get(i);
|
||||||
|
|
||||||
|
if (priBytes.length > 0)
|
||||||
|
return new String(priBytes);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void outln(Object o) {
|
||||||
|
System.out.println(o);
|
||||||
|
}
|
||||||
|
public static void out(Object o) {
|
||||||
|
System.out.print(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
100
src/fr/pandacube/java/logviewer/test/Test.java
Normal file
100
src/fr/pandacube/java/logviewer/test/Test.java
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
package fr.pandacube.java.logviewer.test;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import fr.pandacube.java.logviewer.Main;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test du logiciel LogViewer.<br/>
|
||||||
|
*
|
||||||
|
* Lance un Thread qui écrit aléatoirement dans un fichier de la même manière que dans un fichier log.
|
||||||
|
* Ce fichier est réinitialisé pour simuler la rotation des fichiers logs.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author Marc
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class Test {
|
||||||
|
|
||||||
|
|
||||||
|
private static BufferedWriter wr;
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
|
||||||
|
File f = new File("testFile");
|
||||||
|
|
||||||
|
|
||||||
|
f.createNewFile();
|
||||||
|
|
||||||
|
AtomicBoolean terminate = new AtomicBoolean(false);
|
||||||
|
|
||||||
|
wr = new BufferedWriter(new FileWriter(f));
|
||||||
|
|
||||||
|
Thread th = new Thread(() -> {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
while(!terminate.get()) {
|
||||||
|
|
||||||
|
wr.write(randomLine());
|
||||||
|
wr.flush();
|
||||||
|
Thread.sleep(r.nextInt(10));
|
||||||
|
|
||||||
|
if (r.nextInt(10) == 0) {
|
||||||
|
wr.close();
|
||||||
|
f.delete();
|
||||||
|
f.createNewFile();
|
||||||
|
wr = new BufferedWriter(new FileWriter(f));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}, "Testing Thread");
|
||||||
|
|
||||||
|
th.start();
|
||||||
|
|
||||||
|
Thread.currentThread().setName("Tested Thread");
|
||||||
|
Main.main(new String[] {"testFile"});
|
||||||
|
|
||||||
|
terminate.set(true);
|
||||||
|
th.join();
|
||||||
|
|
||||||
|
wr.close();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static Random r = new Random();
|
||||||
|
private static char[] chars = new char[] {' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', '♪', '♫', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
|
||||||
|
|
||||||
|
public static String randomLine() {
|
||||||
|
int length = r.nextInt(100)+15;
|
||||||
|
String s = "";
|
||||||
|
for (int i=0; i<length; i++)
|
||||||
|
s+=chars[r.nextInt(chars.length)];
|
||||||
|
|
||||||
|
return s+'\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user