2010-08-31 7 views
0

J'utilise des classes de journalisation java.util pour créer un appendeur de fichiers. Je veux créer un lecteur de journal qui lit à partir de ces journaux lorsque les données leur sont écrites.La création de fichiers roulants Java échoue lors de la tentative de lecture simultanée

Le code d'application du journal de roulement fonctionne correctement. Mais une fois que je lance le lecteur, les nouveaux fichiers ne sont pas créés, c'est-à-dire que si l'appendeur de log roulant est configuré pour utiliser 5 fichiers, il créera 1og.0, log.1, log.2 et ainsi de suite. create log.0 aucun autre fichier n'est créé. Je remarque ceci dans Java journalisation et log4j. J'utilise nio pour lire dans le lecteur de journal. Donc, mon doute est, est la création d'un autre FileChannel sur le même fichier créant un problème? ou ai-je manqué quelque chose de base nio ici qui cause des problèmes.

ici est le code ..

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.. 
     } 
} 

Répondre

0

Je pense qu'il pourrait y avoir des problèmes de concurrence avec RandomAccessFile.

Je vous suggère d'utiliser une classe différente pour lire le fichier. Par exemple. java.io.FileReader

+0

ouais le problème était avec RandonAccessFile – Guru

Questions connexes