我想使用java来读取weblogic日志文件,而weblogic正在写入日志(缓冲),但我只想读取当我开始阅读时出现的内容。
我该怎么做?
public class DemoReader implements Runnable{
public void run() {
File f = new File ("c:\\test.txt");
long length = f.length();
long readedBytes = 0;
System.out.println(length);
try {
BufferedReader fr = new BufferedReader(new FileReader(f));
String line = "";
while((line = fr.readLine()) != null && readedBytes < length){
readedBytes += line.getBytes().length;
if(readedBytes > length){
break;
}else{
System.out.println(line);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
您可以在开始阅读时获取文件的大小,然后读取N
个字节数(假设文件未被编写器锁定,其内容来自{{1} }} 0
不会被改变。)
答案 1 :(得分:1)
只要日志文件仅被锁定以进行写访问,您应该能够像@ karim79建议的那样将其复制。之后,副本属于您,因此您可以随心所欲地做任何事情。
以下是一些应该实现您所需要的代码 - 它只是将文件逐字节复制到System.out流:
public class Main {
public static void main(String[] args) throws IOException {
// Identify your log file
File file = new File("path/to/your/logs/example.log");
// Work out the length at the start (before Weblogic starts writing again)
long size = file.length();
// Read in the data using a buffer
InputStream is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
long byteCount=0;
int result;
do {
// Read a single byte
result = bis.read();
if (result != -1)
{
// Do something with your log
System.out.write(result);
} else {
// Reached EOF
break;
}
byteCount++;
} while (byteCount<size);
// Printing this causes a final flush of the System.out buffer
System.out.printf("%nBytes read=%d",byteCount);
bis.close();
is.close();
}
}
然后你去。
有关日志文件的说明
如果日志文件很大(例如> 1Gb),那么您应该考虑更改日志记录配置以合并滚动日志文件,该日志文件会自动将日志分解为更适合查看的块(例如1Mb) shell编辑器(如vim)。