同时监视多个日志文件

时间:2012-01-18 13:45:20

标签: java

我制作了一个持续监控日志文件的程序。但我不知道如何监控多个日志文件。这是我监控单个文件所做的。我应该在以下代码中做出哪些更改,以便它还监视多个文件?

package com.read;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileWatcherTest {

    public static void main(String args[]) {

        final File fileName = new File("D:/logs/myFile.log");

        // monitor a single file
        TimerTask fileWatcherTask = new FileWatcher(fileName) {

            long addFileLen = fileName.length();
            FileChannel channel;
            FileLock lock;
            String a = "";
            String b = "";

            @Override
            protected void onChange(File file) {

                RandomAccessFile access = null;
                try {
                    access = new RandomAccessFile(file, "rw");
                    channel = access.getChannel();
                    lock = channel.lock();
                    if (file.length() < addFileLen) {
                        access.seek(file.length());
                    } else {
                        access.seek(addFileLen);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                String line = null;
                try {

                    while ((line = access.readLine()) != null) {

                        System.out.println(line);

                    }

                    addFileLen = file.length();

                } catch (IOException ex) {
                    Logger.getLogger(FileWatcherTest.class.getName()).log(
                            Level.SEVERE, null, ex);
                }
                try {
                    lock.release();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                } // Close the file

                try {
                    channel.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        };

        Timer timer = new Timer();
        // repeat the check every second
        timer.schedule(fileWatcherTask, new Date(), 1000);
    }
}




package com.read;

import java.util.*;
import java.io.*;

public abstract class FileWatcher extends TimerTask {

    private long timeStamp;
    private File file;
    static String s;

    public FileWatcher(File file) {
        this.file = file;
        this.timeStamp = file.lastModified();
    }

    public final void run() {
        long timeStamp = file.lastModified();

        if (this.timeStamp != timeStamp) {
            this.timeStamp = timeStamp;

            onChange(file);
        }
    }

    protected abstract void onChange(File file);
}

1 个答案:

答案 0 :(得分:1)

你应该使用线程。这是一个很好的教程:

  

http://docs.oracle.com/javase/tutorial/essential/concurrency/

您可以这样做:

public class FileWatcherTest {

    public static void main(String args[]) {
        (new Thread(new FileWatcherRunnable("first.log"))).start();
        (new Thread(new FileWatcherRunnable("second.log"))).start();
    }

    private static class FileWatcherRunnable implements Runnable {
        private String logFilePath;
        // you should inject the file path of the log file to watch
        public FileWatcherRunnable(String logFilePath) {
           this.logFilePath = logFilePath;
        }
        public void run() {
            // your code from main goes in here
        }
    }
}