2010-08-31 5 views
0

Я использую классы ведения журнала java.util для создания скользящего файла. Я хочу создать читатель журнала, который читает из этих журналов, когда данные записываются в них.Создание файла роллинга Java Сбой при попытке чтения одновременно

Сводный код приложения для журналов работает отлично. Но как только я запускаю поток читателей, новые файлы не создаются, т. Е. Если в скользящем приложении журнала используется 5 файлов, он будет создавать 1og.0, log.1, log.2 и т. Д., Но если поток читателя начнется, он будет только create log.0 никакие другие файлы не создаются. Я замечаю это как в java logging, так и в log4j.

Я использую nio для чтения в устройстве чтения журнала. Так что я сомневаюсь, создает другой FileChannel в том же файле, создавая некоторые проблемы? или я пропустил какой-то базовый материал nio здесь, что вызывает проблемы.

здесь код ..

public class Test { 

    private static final long initialTime = System.currentTimeMillis(); 
    private static Logger logger = Logger.getLogger(Test.class.getName()); 
    public static void main(String[] args) { 

     logger.setLevel(Level.INFO); 
     try { 
      BufferedReader reader = new BufferedReader(
              new InputStreamReader(
                new FileInputStream(
                  new File(System.getProperty("user.dir")+File.separator+"input.dat")))); 

      FileHandler handler = new FileHandler("log/test.log", 1024, 5, true); 
      handler.setFormatter(new SimpleFormatter()); 
      logger.addHandler(handler); 
      logger.setUseParentHandlers(false); 
      //If I comment the next two lines the rolling appender works as expected both in java logging 
      //and when using log4j. however once I start the log reader only one file is created. 
      Thread logReader = new Thread(new LogReader("log/test.log.0")); 
      logReader.start(); 
      while(reader.ready()) 
      { 
       String strToLog = reader.readLine(); 
       logger.info(strToLog); 
       //Only want to run this for 10 secs. 
       if(System.currentTimeMillis() - initialTime > 10000) 
        System.exit(0); 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     finally{ 

     } 
    } 

} 
class LogReader implements Runnable { 


    private final int BUFFER_SIZE = 1024; 

    private RandomAccessFile file; 

    private FileChannel chan; 

    private long offset; 

    private ByteBuffer buf; 

    private Charset charset = Charset.forName("UTF-8"); 

    private String filename = "output.log"; 

    public LogReader(String logfile) throws IOException { 
     System.out.println("Starting log reader from " + logfile); 
     file = new RandomAccessFile(logfile, "r"); 
     offset = file.length(); 
     chan = file.getChannel(); 
     chan.position(offset); 
     buf = ByteBuffer.allocateDirect(BUFFER_SIZE); 
     System.out.println("Started log reader from " + logfile); 
    } 

    public void run() { 
     //Even if I have nothing here..the problem exists.. 
     } 
} 

ответ

0

Я думаю, что там могут быть некоторые проблемы параллелизма с RandomAccessFile.

Предлагаю вам использовать другой класс для чтения файла. Например. java.io.FileReader

+0

Да, проблема была в RandonAccessFile – Guru