Постоянно читать строки, добавляемые в файл журнала - PullRequest
6 голосов
/ 10 февраля 2010

Относительно моего предыдущего вопроса , я обнаружил, что maven не может действительно выводить консоль jboss. Поэтому я подумал, что хотел бы обойти это. Вот сделка:

Когда jboss работает, он записывает консольные журналы в файл server.log, поэтому я пытаюсь получить данные по мере их поступления, потому что каждые несколько секунд файл изменяется / обновляется jboss. Я сталкиваюсь с некоторыми трудностями. поэтому мне нужна помощь.

Что мне действительно нужно, так это:

  1. читать файл server.log
  2. при изменении server.log с добавлением еще нескольких строк выведите изменение

Вот код, который я получил, есть проблема с ним, он работает бесконечно и запускается каждый раз с начала файла, я бы хотел, чтобы он продолжал печатать только новые строки из server.log , Надеюсь, в этом есть какой-то смысл, вот код:

import java.io.*;


class FileRead 
{
   public static void main(String args[])
  {
      try{
   for(;;){ //run indefinitely
    // Open the file 
    FileInputStream fstream = new FileInputStream("C:\\jboss-5.1.0.GA\\server\\default\\log\\server.log");
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
    String strLine;
    //Read File Line By Line
    while ((strLine = br.readLine()) != null)   {
      // Print the content on the console
      System.out.println (strLine);
    }
    //Close the input stream
    in.close();
    }
  }
      catch (Exception e){//Catch exception if any
      System.err.println("Error: " + e.getMessage());
    }
  }
}

Согласно предложению Монтекристо, я сделал это:

import java.io.*;

class FileRead {
    public static void main(String args[]) {
        try {
            // Open the file that is the first
            // command line parameter
            FileInputStream fstream = new FileInputStream(
                    "C:\\jboss-5.1.0.GA\\server\\default\\log\\server.log");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String line;
            // Read File Line By Line
            while ((line = br.readLine()) != null) {
                // Print the content on the console
                line = br.readLine();
                if (line == null) {
                    Thread.sleep(1000);
                } else {
                    System.out.println(line);
                }

            }
            // Close the input stream
            in.close();

        } catch (Exception e) {// Catch exception if any
            System.err.println("Error: " + e.getMessage());
        }
    }
}

И он все еще не работает, он просто печатал оригинальный файл .. хотя файл постоянно меняется, ничего не происходит .. ничего не распечатывается, кроме исходного файла журнала.

ЗДЕСЬ РЕШЕНИЕ: tnx Montecristo

import java.io.*;

class FileRead {
    public static void main(String args[]) {
        try {

            FileInputStream fstream = new FileInputStream(
                    "C:\\jboss-5.1.0.GA\\server\\default\\log\\server.log");

            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String line;

            while (true) {

                line = br.readLine();
                if (line == null) {
                    Thread.sleep(500);
                } else {
                    System.out.println(line);
                }

            }

        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

Также см .:

http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html

Ответы [ 2 ]

2 голосов
/ 10 февраля 2010

Я не знаю, движетесь ли вы в правильном направлении, но если я правильно понял, вы найдете это полезным: java-io-creation-of-unix-linux-tail-f

1 голос
/ 26 октября 2018

Вы можете использовать RandomAccessFile.

import java.io.IOException;
import java.io.RandomAccessFile;

public class LogFileReader {

    public static void main( String[] args ) {
       String fileName = "abc.txt";
       try {
        RandomAccessFile bufferedReader = new RandomAccessFile( fileName, "r" 
        );

        long filePointer;
        while ( true ) {
            final String string = bufferedReader.readLine();

            if ( string != null )
                System.out.println( string );
            else {
                filePointer = bufferedReader.getFilePointer();
                bufferedReader.close();
                Thread.sleep( 2500 );
                bufferedReader = new RandomAccessFile( fileName, "r" );
                bufferedReader.seek( filePointer );
            }

        }
    } catch ( IOException | InterruptedException e ) {
        e.printStackTrace();
    }

}
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...